测试以检查python列表中是否存在列表

测试以检查python列表中是否存在列表,python,Python,基本上,我需要得到一些列表的排列。所以,我使用的方法是随机洗牌列表字符串以获得排列并将其添加到列表中,同时添加我检查列表中是否存在相同的排列。我无法执行检查。这是我写的代码 list = [x for x in range(0,max)] totalperm = 10 perms = [] while(len(perms) <> totalperm): random.shuffle(list) if list not in perms:

基本上,我需要得到一些列表的排列。所以,我使用的方法是随机洗牌列表字符串以获得排列并将其添加到列表中,同时添加我检查列表中是否存在相同的排列。我无法执行检查。这是我写的代码

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)            
list=[x代表范围内的x(0,最大)]
totalperm=10
perms=[]
while(len(perms)totalperm):
随机。随机(列表)
如果列表不在perms中:
perms.append(列表)

请让我知道我在这里遗漏了什么。

当你洗牌列表时,你在原地修改它。稍后,您将其引用添加到烫发列表中。下一次通过循环时,再次将列表洗牌。如果您查看perms,它将包含对原始列表的n个引用

您可能希望执行类似的操作:

shuffled = list[:]
random.shuffle(shuffled)
if shuffled not in perms:
    perms.append(shuffled)

[1,2,3]in[[1,2,3],[4,5,6]==True


对我有用。这是您的全部代码吗?

使用python的内置
集来防止重复:

perms = set()
while len(perms) != totalperm:
    random.shuffle(lst)        
    perms.add(tuple(lst))

这不起作用,因为您一直在使用对单个列表的引用,所以它总是在您第一次附加它之后出现在列表中

考虑:

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]]

在代码中,
perms[0]
是相同的对象,具有相同的值。因此,当你问
项目是否在
perms
中时,答案总是肯定的。因为你只是把它放在那里

解决方案很简单:添加列表的副本

perms.append(items[:])
顺便说一下,您可能应该使用
集合
而不是
列表
来存储排列。检查
集合的成员身份要快得多
,添加重复项的尝试被忽略。唯一的缺点是不能将列表放入
集中,因为列表是可变的,因此是不可破坏的——幸运的是,您可以将它们转换为元组,元组是不可变的和可散列的。那么你有:

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)) 
items=range(0,max)#Python 3:items=list(range(0,max))
perms=set()
nump=10
而len(perms)
您的代码将进入无限循环,因为您将
列表更改到位。然后测试它是否在
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!"
随机导入
最大值=4
列表=[x代表范围内的x(0,最大)]
totalperm=10
perms=[]
而(len(perms)
甚至,我的想法和你一样。因此,我做了以下操作:'perms=[]while(len(perms)totalperm):listnew=list random.shuffle(listnew)如果listnew不在perms:perms.append(listnew)print perms del listnew'但这也不起作用。listnew=list不起作用,您需要listnew=list[:]来显式复制list@AnandGupta,
listnew=list
不创建列表的副本,它只创建指向同一列表的新变量。您需要
listnew=list[:]
。我会查看
set
示例,这些示例更具python风格。如果将列表存储在变量中,然后进行检查,则这将不起作用。您无法将列表添加到集合中,因为它们是不可损坏的(并且是可变的)。使用
元组(items)
而不是
items[:]
。罗布:是的,真不敢相信我忘了。固定的!