2016-08-04 77 views
1

從概念上講,這很容易,但我似乎無法弄清楚。使用Python的詞典理解,通過首字母索引單詞列表

我想將字符串列表轉換爲字典,每個鍵是與其關聯的單詞列表的第一個字母。

# My list of sounds 
sounds = ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore'] 

# My dict comprehension which isn't working 
indexed = {s[0]: [s] for s in sounds} 

我的輸出是這樣的:

{'h': ['heck'], 's': ['sniff'], 'b': ['bore']} 

我在這裏缺少一個附加功能,但每次我嘗試的時間來實現它沒有給我正確的輸出,或者它拋出一個SyntaxError 。我錯過了什麼?

+0

2個不同的值不能具有相同的密鑰。因此,每次出現新的「b ...」或「h ...」或「s ...」時,您都要繼續寫下以前的值,因爲它們給出相同的鍵「b」,「h」和「的」。你應該閱讀關於詞典... – Julien

+2

不要理解這個東西 –

+2

這種分組任務不適合理解。正常的循環效果更好。 – user2357112

回答

4

這可以一氣呵成地完成只用標準庫

>>> sounds = ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore'] 
>>> result=dict() 
>>> for s in sounds: 
     result.setdefault(s[0],[]).append(s) 

>>> result 
{'b': ['bark', 'bork', 'blork', 'borf', 'bjork', 'boo', 'bre', 'bore'], 's': ['sniff'], 'h': ['heck']} 
>>> 

與itertools的解決方案是好的,但它需要排序列表的額外的步驟,使之爲O(n日誌N),而該做同樣的,在短短一個走得那麼是O(n)

collections模塊報價defaultdictsetdeafult

01有一個構建
0

這是你想要實現的嗎?

firsts = {s[0] for s in sounds} 
indexed = {first: [s for s in sounds if s[0]==first] for first in firsts} 
+0

這是如何使它與理解一起工作,但不幸的是它仍然是O(n^2)在最壞的情況下都有自己的關鍵。 –

3

沒問題,itertools to the rescue。您可以按照他們的第一個字母對這些元素進行分組,然後從中創建一個字典。

sounds = ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore'] 
import itertools 

grouped = itertools.groupby(sorted(sounds), key=lambda x: x[0]) 
d = {k: list(v) for k,v in grouped} 
print(d) 
+0

美麗!我會把它分開。謝謝您的幫助! – Drew

+0

@Drew對itertools有更深入的瞭解,它可以工作奇蹟(它可以在迭代器上工作,所以在某些情況下,可以覆蓋無限序列和東西)。 – Carsten

0

這不是一個很好的用於詞典理解 - 你會得到比你需要更多的循環。如果直接寫入,則只能掃描一次輸入列表:

dict1 = {} 
for s in ['sniff', 'bark', 'bork', 'blork', 'heck', 'borf', 'bjork', 'boo', 'bre', 'bore']: 
    if not s[0] in dict1.keys(): 
    dict1[ s[0] ] = [] 
    dict1[ s[0] ].append(s)  
print dict1