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

时间:2012-01-20 21:34:12

标签: python

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

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 个答案:

答案 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]]。

在您的代码中,itemsperms[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!"