我一直在工作几个月,开启和关闭脚本,以便在文本文件中随机播放列表。我是Python的初学者(这是我理解的唯一一种语言),过了一段时间,我设法想出了几行代码,这些代码完成了我需要的东西。Python - 用约束对一个列表进行随机排序
我拥有的输入文件是一个选项卡式列表。它具有每行5个字,但这样看起来的例子更清楚我会让它的数字:现在
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
,经过几次努力和SO用户的工作,数额巨大,我已经成功地洗牌这些元素,以便它们不会出现在与原始“合作伙伴”相同的行中。这是我正在使用的代码:
import csv,StringIO
import random
from random import shuffle
datalist = open('lista.txt', 'r')
leyendo = datalist.read()
separando = csv.reader(StringIO.StringIO(leyendo), delimiter = '\t')
macrolist = list(separando)
l = [group[:] for group in macrolist]
random.shuffle(l)
nicendone = []
prev_i = -1
while any(a for a in l):
new_i = max(((i,a) for i,a in enumerate(l) if i != prev_i), key=lambda x: len(x[1]))[0]
nicendone.append(l[new_i].pop(random.randint(0, len(l[new_i]) - 1)))
prev_i = new_i
with open('randolista.txt', 'w') as newdoc:
for i, m in enumerate(nicendone, 1):
newdoc.write(m + [', ', '\n'][i % 5 == 0])
datalist.close()
这样做的工作,但我真正需要的是一点复杂。我需要按照以下限制对列表进行随机整理:
- 第一列和第二列中的词应该在其自己的列中进行混洗。
- 新的随机列表应该没有两个元素再次出现在同一行中。
我想什么得到的是类似以下内容:
01 17 25 19 13
16 22 13 03 20
etc
因此,在第一和第二列项只属于自己的栏目内洗牌,没有两个项目是在输出中同一行中的同一行。我意识到在一个5行的例子中,这个最后的约束不断被打破,但真正的输入文件有100行。
我真的不知道如何开始这样做。我的编程能力是有限的,但问题是,我甚至不能为它创建一个伪代码。我怎样才能让Python识别前两列的元素,以便只将它们垂直拖动?
在此先感谢
不要让'1 2 3 4 5'到'1 7 43 52 15'部分。你能否用类似于输入和预期输出的5行示例来更新问题? –
好的,你的意思是编辑原始问题。对不起。 –