2013-01-24 80 views
3

我是一個用python編程的新手,需要一些幫助:我有一個列表,我之前在程序中創建了一個附加循環(即我不能重新定義我的現在列表解決我的問題),24個4元組:元組的Python列表

elementary = [(23, 1, 18, 4), (23, 1, 6, 16), (23, 1, 4, 18), (23, 2, 18, 3), (23, 2, 12, 9), (23, 2, 9, 12), (23, 2, 3, 18), (23, 3, 18, 2), (23, 3, 2, 18), (23, 4, 18, 1), (23, 4, 1, 18), (23, 5, 14, 7), (23, 5, 7, 14), (23, 6, 16, 1), (23, 6, 9, 8), (23, 6, 8, 9), (23, 6, 1, 16), (23, 7, 14, 5), (23, 7, 5, 14), (23, 8, 9, 6), (23, 8, 6, 9), (23, 9, 12, 2), (23, 9, 8, 6), (23, 9, 6, 8), (23, 9, 2, 12), (23, 12, 9, 2), (23, 12, 2, 9), (23, 14, 7, 5), (23, 14, 5, 7), (23, 16, 1, 6), (23, 18, 4, 1), (23, 18, 3, 2), (23, 18, 2, 3), (23, 18, 1, 4)] 

,但現在想擺脫那些剛剛重新安排......換句話說,元組,第一個元組後((23,1,18,4) )我會放棄(23,1,4,18), (23,4,1,18)等,如果可能的話,我希望在整個列表中這樣做,這樣我只能得到6個完全不同的4元組。有沒有什麼辦法可以做到這一點,而不必在我的計劃中早一點做回事情?任何幫助將不勝感激。謝謝!

+2

歡迎來到SO。你有什麼嘗試? – tacaswell

回答

2

作爲單線程,它對每個4元組進行排序,然後創建一組結果,這樣可以消除重複項。我假設你的4元組被允許改變元素的順序。

set(tuple(sorted(i)) for i in elementary) 

>>> set((5, 7, 14, 23), (6, 8, 9, 23), (2, 3, 18, 23), (1, 4, 18, 23), (1, 6, 16, 23), (2, 9, 12, 23)) 
+0

這破壞了原始的元組排序,這可能是也可能不是問題... – wim

0

你真的只有24嗎?如果是這樣,有一些不必要的內存分配一個緩慢的上下的解決方案可以很好地工作在這裏,並節省您的編程時間:

elementary_unique = set(tuple(sorted(t)) for t in elementary) 

現在elementary_unique是一個集,而不是一個清單 - 如果它很重要,你可以使用

elementary_unique = list(set(tuple(sorted(t)) for t in elementary)) 

取而代之,但這會比第一個版本慢一點。

+0

非常感謝大家!我結束了使用elementary_unique設置版本,但我會給所有的建議一個鏡頭作爲一個學習練習。再次感謝! – user2006083

1

無論何時只要sorted(tuple1) == sorted(tuple2)您都可以識別等效組合。

的代碼是簡短而親切:

>>> set(map(tuple, map(sorted, elementary))) 
set([(5, 7, 14, 23), (6, 8, 9, 23), (2, 3, 18, 23), 
    (1, 4, 18, 23), (1, 6, 16, 23), (2, 9, 12, 23)]) 

如果您需要保存每個第一不同的元組的排序,它需要更多一點的工作:

>>> uniq = set() 
>>> for t in elementary: 
    s = tuple(sorted(t)) 
    if s not in uniq: 
     uniq.add(s) 
     print t 

(23, 1, 18, 4) 
(23, 1, 6, 16) 
(23, 2, 18, 3) 
(23, 2, 12, 9) 
(23, 5, 14, 7) 
(23, 6, 9, 8) 
0

如果你真的想要貶低和比較髒:

In [1028]: elementary = [(23, 1, 18, 4), (23, 1, 6, 16), (23, 1, 4, 18), (23, 2, 18, 3), (23, 2, 12, 9), (23, 2, 9, 12), (23, 2, 3, 18), (23, 3, 18, 2), (23, 3, 2, 18), (23, 4, 18, 1), (23, 4, 1, 18), (23, 5, 14, 7), (23, 5, 7, 14), (23, 6, 16, 1), (23, 6, 9, 8), (23, 6, 8, 9), (23, 6, 1, 16), (23, 7, 14, 5), (23, 7, 5, 14), (23, 8, 9, 6), (23, 8, 6, 9), (23, 9, 12, 2), (23, 9, 8, 6), (23, 9, 6, 8), (23, 9, 2, 12), (23, 12, 9, 2), (23, 12, 2, 9), (23, 14, 7, 5), (23, 14, 5, 7), (23, 16, 1, 6), (23, 18, 4, 1), (23, 18, 3, 2), (23, 18, 2, 3), (23, 18, 1, 4)] 

In [1029]: for e in elementary:                                 
       add = True                                     
       for a in answer:                                     
        if all(_e in a and e.count(_e)==a.count(_e) and len(e)==len(a) for _e in e): 
         add = False 
       if add: 
        answer.append(e)  

In [1030]: answer 
Out[1030]: 
[(23, 1, 18, 4), 
(23, 1, 6, 16), 
(23, 2, 18, 3), 
(23, 2, 12, 9), 
(23, 5, 14, 7), 
(23, 6, 9, 8)] 
+0

您的格式爆炸.... – tacaswell

3

如何:

{tuple(sorted(t)): t for t in elementary}.values()