首页 > 解决方案 > 保存多个洗牌的 csv 文件

问题描述

有没有一种快速的方法可以将列表洗牌 n 次(以不同的顺序)并将其保存为 n 个单个 csv 文件?我已经搜索了很多,但找不到任何关于它的东西。我有以下代码,但我确信它可能会更短,因此我不能确定所有洗牌列表都有不同的顺序。有人有解决方案吗?

import random

example = ['S01_a', 'S01_b', 'S02_a', 'S02_b', 'S03_a', 'S03_b', 'S04_a']

while True:
    example

    shuffle3 = []

    last = ""

    while example:
        i = example
        if last:
            i = [x for x in i if x[4] != last[4]]
        if not i:
            #no valid solution
            break 
        newEl = random.choice(i)
        last = newEl
        shuffle3.append(newEl)
        example.remove(newEl)
    if not example:
        break


fid = open("example.csv", encoding='latin1', mode="w")
fid.writelines(shuffle3)
fid.close()

标签: pythonlistcsvrandomshuffle

解决方案


您可以在列表索引上生成所有可能的排列,然后按照排列给出的顺序选择元素以生成新的打乱列表。最后,打乱列表列表并选择第一个 N。

from itertools import permutations
from random import shuffle


example = ['S01_a', 'S01_b', 'S02_a', 'S02_b', 'S03_a', 'S03_b', 'S04_a']
indices = [x for x in range(0,len(example))]
n_perm = 5

all_permutations = list(set(permutations(indices)))
shuffle(all_permutations)
my_permutations = all_permutations[:n_perm]       

for index, elem in enumerate(my_permutations):

    new_shuffle = [example[x] for x in elem]    
    with open("example_{}.csv".format(str(index)), "w") as fid:
        fid.writelines(",".join(new_shuffle))

推荐阅读