基本上,我需要对列表进行一些排列。因此,我使用的方法是随机地重新排列列表字符串以获得排列并将其添加到列表中,同时添加我检查列表中是否存在相同的排列。我无法执行检查。这是我写的代码。
list = [x for x in range(0,max)]
totalperm = 10
perms = []
while(len(perms) <> totalperm):
random.shuffle(list)
if list not in perms:
perms.append(list)
请让我知道我在这里失踪了什么。
答案 0 :(得分:4)
使用python的内置set
来防止重复:
perms = set()
while len(perms) != totalperm:
random.shuffle(lst)
perms.add(tuple(lst))
答案 1 :(得分:3)
当你洗牌时,你正在修改它。稍后,您将对它的引用添加到您的权限列表中。下次循环时,您将再次将列表重新排列。如果查看perms,它将包含对原始列表的n个引用。
你可能想要做这样的事情:
shuffled = list[:]
random.shuffle(shuffled)
if shuffled not in perms:
perms.append(shuffled)
答案 2 :(得分:2)
这不起作用,因为你一直在处理对单个列表的引用,所以它在你第一次追加它之后总是在列表中。
考虑:
perms = []
items = [1, 2, 3]
random.shuffle(mylist) # perhaps items is now [2, 1, 3]
perms.append(items) # perms is now [[2, 1, 3]]
random.shuffle(mylist) # perhaps items is now [1, 3, 2]
perms.append(items) # now what is perms?
答案是,perms
有两个对单个列表的引用,因此它是[1,3,2],[1,3,2]]。
在您的代码中,items
和perms[0]
是同一个对象,并且具有相同的值。因此,当您询问items
是否在perms
时,答案始终是肯定的。因为你只是把它放在那里!
解决方案很简单:添加列表副本。
perms.append(items[:])
顺便说一下,您应该使用set
而不是list
来存储您的排列。检查set
的成员资格要快得多,并且忽略了尝试添加重复项。唯一的缺点是您不能将列表放在set
中,因为列表是可变的,因此不可用 - 幸运的是,您可以将它们转换为元组,这些元组是不可变的和可清除的。然后你有:
items = range(0, max) # Python 3: items = list(range(0, max))
perms = set()
nump = 10
while len(perms) < nump:
random.shuffle(items)
perms.add(tuple(items))
答案 3 :(得分:1)
[1,2,3] in [[1,2,3], [4,5,6]] == True
适合我。这是你的全部代码吗?
答案 4 :(得分:0)
您的代码将进入无限循环,因为您更改了list
。然后你测试看它是否在perms
,大惊喜,它是!所以它永远不会附加perms
。
重复广告。
我是这样做的:
import random
max = 4
list = [x for x in range(0, max)]
totalperm = 10
perms = []
while(len(perms) < totalperm):
copiedlist = list[:]
random.shuffle(copiedlist)
if copiedlist not in perms:
perms.append(copiedlist)
print perms
else:
print "It's already there, egads!"