2016-08-04 8 views
1

概念的には、これはかなり簡単ですが、わかりません。Python dict comprehensionを使用して単語リストを最初の文字でインデックス化する

文字列のリストを、各キーがそれに関連付けられた単語のリストの最初の文字であるdictに変えたいと思っています。

# 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"、 " 「s」。あなたはおそらく辞書について読むべきでしょう... – Julien

+2

このようなものには理解を使用しないでください。 –

+2

このような分類作業は、理解のためには適していません。通常のループがはるかに優れています。 – user2357112

答えて

4

これはitertoolsとソリューションは結構ですが、それはリストをソートする余分なステップを必要とし、それはO(n個のログ作る

>>> 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']} 
>>> 

ちょうど標準ライブラリで一度に行うことができますn)は、この1つだけが行くで同じことを行うので、O(n)の

setdeafult

01でビルドを持って collectionsモジュールの提供 defaultdictがありながら、
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。最初の文字で要素をグループ化し、その中からdictを作成することができます。

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

これは、ディクテーションの理解には適していません。必要以上のループを繰り返すことになります。それを直接書くと、入力リストを1回スキャンするだけです。

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 
関連する問題