[英]Test to check if a list is present inside a python list of lists
基本上,我需要获得列表的少量排列。 因此,我使用的方法是随机地整理列表字符串以获取排列并将其添加到列表中,同时添加我检查列表中是否存在相同的排列。 我无法执行检查。 这是我编写的代码。
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)
请让我知道我在这里想念什么。
使用python的内置set
来防止重复:
perms = set()
while len(perms) != totalperm:
random.shuffle(lst)
perms.add(tuple(lst))
整理列表时,是在适当位置进行修改。 后来,您将对它的引用添加到烫发列表中。 下次在您的循环中,您将重新整理列表。 如果您查看烫发,它将包含对原始列表的n个引用。
您可能想改为执行以下操作:
shuffled = list[:]
random.shuffle(shuffled)
if shuffled not in perms:
perms.append(shuffled)
这是行不通的,因为您一直都在使用对单个列表的引用,因此在您第一次添加单个列表之后,它始终在列表中。
考虑:
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
有两个对单个列表的引用,因此它是[ perms
],[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))
[1,2,3] in [[1,2,3], [4,5,6]] == True
为我工作。 这是您的全部代码吗?
您的代码将陷入无限循环,因为您更改了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!"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.