2015-04-05 61 views
0

給出一個詞典:拆分字典鍵進入名單

d = {'one two':2, 'three four':4, 'one three':0} 

我想分裂鍵,並創建一個列表或設置:

s = ('one','two','three','four') 

我已經試過:

s = set(kk for kk in k.split() for k in d.keys()) 

但是這產生了:

('four','three') 

如何獲取所有密鑰?

回答

2

加入從所有鍵帶空格的字典,將結果字符串拆分成可能包含重複項的列表,然後從該列表創建一個集合:

set(' '.join(d.keys()).split()) 

編輯 關於複雜性的以下聲明是錯誤的。兩者都是O(n),因爲沒有構造中間數據結構,所以列表解析稍微更有效。我在這裏留下了錯誤的主張,因爲評論中有很好的解釋。

該方法是O(n)。你的方法和其他答案中的是O(n^2)。


>>> d = {'one two':2, 'three four':4, 'one three':0} 
>>> set(' '.join(d.keys()).split()) 
set(['four', 'three', 'two', 'one']) 
+0

「你的方法和其他答案中的是O(n^2)」 - 不正確。 – 2015-04-05 01:44:26

+0

@SteveJessop在這些列表解析中有2個for循環...不是那個O(n^2)嗎? – mhawke 2015-04-05 01:45:37

+0

迭代的事物總數是相同的:分割後鍵中的單詞數。所以在這兩種情況下,複雜性都是所有關鍵字的總長度(假設我們允許這些集合在'O(n)'中工作,但爭議同樣影響所有答案)。 – 2015-04-05 01:50:47

4

而是一套,你可以使用列表解析拆分後得到的所有值:

s = [kk for k in d.keys() for kk in k.split()] 
# ['three', 'four', 'one', 'two', 'one', 'three'] 

或獲得獨特的價值觀,使其設置:

s = set([kk for k in d.keys() for kk in k.split()]) 
# {'four', 'one', 'three', 'two'} 
+0

謝謝!這樣可行。我很好奇爲什麼for循環按照這個順序進行。 – 2015-04-05 01:40:59

+0

@Adam_G首先是外部循環,第二個是內部循環。你使用內部循環的'kk'值。 – Marcin 2015-04-05 01:43:58

0

下面是使用functools.reduce在Python 3.X

import functools 
d = {'one two':2, 'three four':4, 'one three':0} 

functools.reduce(or_,[set(k.split()) for k in d.keys()]) 

輸出

{'four', 'one', 'three', 'two'} 

一個元組的結果,你可以做以下的另一種方法:

tuple(functools.reduce(or_,[set(k.split()) for k in d.keys()])) 

輸出

(「四」,「一」,「三化」,「兩節」)

不同於以往的回答了這個最後的編輯將調用元組的要求一組,而不是返回一個元組。與提供的其他解決方案一樣,它正在迭代字典鍵,將鍵分解爲元素,最後將元素減少爲一個元素。與其他解決方案相同的複雜程度。

+0

對此有什麼好處,或者只是一種不同的方法? – 2015-04-05 01:59:15

+0

如果不明顯,'or_'在這裏是'operator.or_'。 – 2015-04-05 02:36:04

+0

如果你真的喜歡功能風格,你可以用'reduce(_or,map(合成)(set,operator.methodcaller('split')),d))''去。除了悲慘的是沒有標準的「組合」。 – 2015-04-05 02:40:35