給出一個詞典:拆分字典鍵進入名單
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')
如何獲取所有密鑰?
給出一個詞典:拆分字典鍵進入名單
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')
如何獲取所有密鑰?
加入從所有鍵帶空格的字典,將結果字符串拆分成可能包含重複項的列表,然後從該列表創建一個集合:
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'])
而是一套,你可以使用列表解析拆分後得到的所有值:
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'}
謝謝!這樣可行。我很好奇爲什麼for循環按照這個順序進行。 – 2015-04-05 01:40:59
@Adam_G首先是外部循環,第二個是內部循環。你使用內部循環的'kk'值。 – Marcin 2015-04-05 01:43:58
下面是使用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()]))
輸出
(「四」,「一」,「三化」,「兩節」)
不同於以往的回答了這個最後的編輯將調用元組的要求一組,而不是返回一個元組。與提供的其他解決方案一樣,它正在迭代字典鍵,將鍵分解爲元素,最後將元素減少爲一個元素。與其他解決方案相同的複雜程度。
對此有什麼好處,或者只是一種不同的方法? – 2015-04-05 01:59:15
如果不明顯,'or_'在這裏是'operator.or_'。 – 2015-04-05 02:36:04
如果你真的喜歡功能風格,你可以用'reduce(_or,map(合成)(set,operator.methodcaller('split')),d))''去。除了悲慘的是沒有標準的「組合」。 – 2015-04-05 02:40:35
「你的方法和其他答案中的是O(n^2)」 - 不正確。 – 2015-04-05 01:44:26
@SteveJessop在這些列表解析中有2個for循環...不是那個O(n^2)嗎? – mhawke 2015-04-05 01:45:37
迭代的事物總數是相同的:分割後鍵中的單詞數。所以在這兩種情況下,複雜性都是所有關鍵字的總長度(假設我們允許這些集合在'O(n)'中工作,但爭議同樣影響所有答案)。 – 2015-04-05 01:50:47