2013-11-27 67 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