2013-11-27 38 views
2

使用此代码:保持其列出唯一的区别只有唯一实例是为了

from itertools import product 

list1 = ['Gabe', 'Taylor', 'Kyle', 'Jay'] 
list2 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list3 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list4 = ['Kyle', 'James', 'John', 'Tyde','Bruno', 'Drew', 'Chris'] 
list5 = ['James', 'John', 'Brendan','Tim', 'Drew' ] 

FinalList = [] 

for x in product(list1, list2, list3, list4, list5): 
    # check for duplicates 
    if len(set(x)) == 5: 
     FinalList.append(x) 

# to print 
for x in FinalList: 
    print x 

我打印出所有独特的名单。然而,许多打印列表是唯一的,因为它们是不同顺序的相同元素。

如何更改我的代码,以便只打印列表,如果它尚未打印只是按不同顺序排列?

+0

再看看在那里的答案,我已经张贴了正确的答案,包括你问这里有什么... –

+0

'product'是写这个简单的方法,但效率不高。 “产品”不能抓住机会缩短循环。 –

回答

1

frozenset可散列且不关心其内容的顺序。只需使用一组,而不是你的final_data,并以不同的顺序相同的名称条目列表将被合并为一个条目final_data

final_data = set() 
for x in product(list1, list2, list3, list4, list5): 
    datum = frozenset(x) 
    if len(datum) == 5: 
     final_data.add(datum) 
+0

>>> isinstance(set(),collections.Hashable) False –

+0

@Guy - *笑,每次都会咬我......我在那里,很高兴地向'final_data'集合添加数据。我已经更新了我的答案以使用'frozenset'。谢谢! –

1

而不是检查组的大小,因为你这样做,店它们中的每一个也在一组中(它使查找变得简单)。

然后检查你是否已经知道set(x);如果你这样做,跳过它,否则把它放入已知集合的集合中。

要将集合存储在集合中,必须使用frozenset而不是set来使内部集合不可变。

工作代码:

from itertools import product 

list1 = ['Gabe', 'Taylor', 'Kyle', 'Jay'] 
list2 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list3 = ['Gabe', 'Taylor', 'Kyle', 'Jay', 'James', 'John', 'Tyde','Chris', 'Bruno', 'David'] 
list4 = ['Kyle', 'James', 'John', 'Tyde','Bruno', 'Drew', 'Chris'] 
list5 = ['James', 'John', 'Brendan','Tim', 'Drew' ] 



def FindUniques(*lists): 
    already_seen = set() 
    result = [] 
    for x in product(*lists): 
     icicle = frozenset(x) 
     if icicle not in already_seen: 
      result.append(x) 
      already_seen.add(icicle) 
    return result 

final_list = FindUniques(list1, list2, list3, list4, list5) 

# make sure that each element in final_list, independent of elemet order, is unique 
assert len(final_list) == len(set(tuple(sorted(list(x))) for x in final_list)) 

# to print 
for x in final_list: 
    print x