检查一个Python列表中是否存在另一个列表的测试

3

基本上,我需要得到一个列表的几个排列方式。所以,我使用的方法是随机地打乱列表字符串以获取排列,并将其添加到一个列表中,同时添加时检查是否存在相同的排列。我无法实现检查。这是我编写的代码。

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)            

请告诉我这里缺少了什么。
5个回答

4
使用Python内置的set来防止重复:
perms = set()
while len(perms) != totalperm:
    random.shuffle(lst)        
    perms.add(tuple(lst))

3

当您洗牌列表时,您正在就地修改它。稍后,您在perms的列表中添加对它的引用。下次通过循环时,您再次就地对列表进行了洗牌。如果您查看perms,它将包含对原始列表的n个引用。

您可能希望改为执行以下操作:

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

即使我也和你想的一样。所以,我做了以下操作:' perms = [] while(len(perms) <> totalperm): listnew = list
random.shuffle(listnew)
if listnew not in perms: perms.append(listnew)
print perms del listnew '但这也不起作用。
- AKG
listnew = list不起作用,您需要使用listnew = list[:]来显式复制列表。 - Chris AtLee
@AnandGupta,“listnew = list”并不会创建列表的副本,它只是创建一个指向同一列表的新变量。你需要使用“listnew = list[:]”。我建议查看一下set的示例,这更符合Python的风格。 - Rob Wouters

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]]。
在您的代码中,itemsperms[0] 是相同的对象并具有相同的值。 因此,当您询问是否在 perms 中存在 items 时,答案总是肯定的。 因为你刚刚放进去了!
解决方案很简单:添加一个列表的拷贝。
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
你不能将列表添加到集合中,因为它们是不可哈希的(且可变的)。请使用 tuple(items) 代替 items[:] - Rob Wouters
罗布:是的,我简直不敢相信我忘了那个。已经修复了! - kindall

1

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

这对我来说可行。这是你所有的代码吗?


1
如果你将列表存储在变量中然后进行检查,那么这种方法是行不通的。 - AKG

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!"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接