2014-02-26 47 views
2
expected = { 
    'l1': ['abc', 'def', 'ghi', 'jkl'], 
    'l2': ['abc', 'ghi', 'jkl', 'mno'] 
} 

我想得到set(['abc', 'def', 'ghi', 'jkl', 'mno'])使用python 2.6+(所以{x for x in ...}是不是我想要的)。蟒蛇集理解做出不同的列表

我已經試過

all_files = set(files for files in expected.values()) 

但它拋出:

TypeError: unhashable type: 'list' 

回答

7
>>> expected = { 
...  'l1': ['abc', 'def', 'ghi', 'jkl'], 
...  'l2': ['abc', 'ghi', 'jkl', 'mno'] 
... } 
>>> set(f for files in expected.itervalues() for f in files) 
set(['jkl', 'abc', 'ghi', 'def', 'mno']) 

或使用itertools.chain.from_iterable

>>> from itertools import chain 
>>> set(chain.from_iterable(expected.itervalues())) 
set(['jkl', 'abc', 'ghi', 'def', 'mno']) 

BTW,使用dict.itervalues而不是dict.values。您不需要一次列出所有列表。

+0

你能解釋一下爲什麼設置expect可排序類型?所有的python設計選擇都是合乎邏輯的,但我看不到原因。 – ducin

+1

@tkoomzaaskz,像'set','dict'這樣的數據結構在內部使用散列值。 – falsetru

+1

@tkoomzaaskz,閱讀[爲什麼字典鍵必須是不可變的? - Python設計和歷史常見問題](http://docs.python.org/2/faq/design.html#why-must-dictionary-keys-be-immutable) – falsetru

0
set(sum(expected.values(),[])) 

將得到以下結果: 集([ 'JKL', 'ABC', 'GHI', '高清', 'MNO'])

因爲你預期設定什麼,忘記了order

+0

這應該避免。它創建了許多列表,刪除它們;導致O(n ** 2)的複雜性。 – falsetru

+0

你爲什麼這麼認爲?請參閱[此timeit結果](http://ideone.com/nJRUtI)。如果你把更多的字典,它會慢得多(相對於其他版本):[另一個時間結果 - 1000條目](http://ideone.com/a47KAt) – falsetru

+0

你是對的,這種方法變得緩慢隨着長度的增加 – fotocoder