2016-05-27 6 views
-1

のリストのリストから辞書を作成リスト1からの分割された単語をキーとして、リスト2からの対応する値を値としてリストする。そして、すでにキーが辞書にあれば、そのキーに値を追加します。のpython私は二つのリストを持っている文字列と整数

{ 
'Barrel': [1], 
'-': [1], 
'Part': [1], 
'1': [1], 
'Petit': [2], 
'Trees': [2], 
# '(sketch)': [2], 
'Island': [3], 
'(sketch)':[2, 3] #in this line the value appended as the key already has a value 2          
} 
+3

あなたのコードから試したコードはどれですか?もしあなたが何も持っていなければ、これはあなたを始めなければなりません:http://www.pythonforbeginners.com/dictionary/dictionary-manipulation-in-python – glls

答えて

0

あなたは結果が故障していることに驚いかもしれませんが、Pythonでdictsが注文を持っていないためです。

は、上記の例では私のような辞書が欲しいです。あなたがそれらを注文したい場合は、バニラディクテーション以外のものを使用する必要があります。

titles = ['Barrel - Part 1', 'Petit Trees (sketch)', 'Island (sketch)'] 
pages = [1, 2, 3] 

finalDict = {} 
for title, page in zip(titles, pages): 
    for word in title.split(" "): 
     if word not in finalDict.keys(): 
      finalDict[word] = [int(page)] 
     else: 
      finalDict[word] += [int(page)] 

print(finalDict) 

この出力:

{'Part': [1], '1': [1], 'Trees': [2], 'Island': [3], 'Barrel': [1], '-': [1], '(sketch)': [2, 3], 'Petit': [2]} 
+1

['collections.OrderedDict'](https:// pymotw.com/2/collections/ordereddict.html)を参照してください。 – rmorshea

+1

ちょうど私はそれをそこに置くと思った。 – rmorshea

+0

ありがとう@Keatinge、これは私が望んだことです、申し訳ありませんが、私はあなたの答えをdownvoted、どうすれば今upvoteできますか?本当にごめんなさい。 –

4

あなたは、同時に2つのリストをループにzip()を使用することができます。あなたが順序である辞書を必要としない場合、それは通常の辞書よりもcollections.defaultdict()を使用する方がはるかに簡単です:

import collections 

titles = ['Barrel - Part 1', 'Petit Trees (sketch)', 'Island (sketch)'] 
pages = [1, 2, 3] 

d = collections.defaultdict(list) 

for title, page in zip(titles, pages): 
    for word in title.split(): 
     d[word].append(page) 

あなたpagesが、それに続く番号のリストだけであるから、それはそうenumerateを使用するために、おそらくより良いですがあなたはKeatingeの答え@と組​​み合わせるOrderedDictを使用することができ、あなたがを行う場合は順番にする辞書を必要とする今

import collections 

titles = ['Barrel - Part 1', 'Petit Trees (sketch)', 'Island (sketch)'] 
d = collections.defaultdict(list) 

for page, title in enumerate(titles, start=1): 
    for word in title.split(): 
     d[word].append(page) 

:あなたはpagesリストに変更を加えるたびに更新する必要はありません

import collections 

titles = ['Barrel - Part 1', 'Petit Trees (sketch)', 'Island (sketch)'] 
d = collections.OrderedDict() 

for title, page in enumerate(titles, start=1): 
    for word in title.split(): 
     if word not in d: 
      d[word] = [page] 
     else: 
      d[word].append(page) 

それともだけ早くdefaultdictソリューションを使用して値を出力するときsorted()に投げる、出力をソートする必要がある場合:

for key in sorted(d.keys()): 
    print('{0}: {1}'.format(key, d[key])) 

最後に、あなたOrderedDefaultDictを使用していますが、最も可能性がありこのようなシンプルなプログラムのためには、これはちょっと残酷だと主張します。

+2

' zip(page_names、page) 'は'zip(page_names、pages)'(ページがページに変更された)とされています – Keatinge

+1

@Keatinge良いキャッチ! –

+1

@MarkusMeskanen 'OrderedDictionary'のコードをより簡潔にするには、' dでない単語を置き換えてください: d [word] = [page] else: d [word] .append(page) 'd.setdefault(単語、[])。append(ページ) ' – jamylak

0

リスト理解アプローチ。

ここでは、リストの理解で基本的に2回の反復が使用されています(私にはもっと違和感があります)。反復処理のもう1つの方法はitertools.chainです。

from collections import defaultdict 
d = defaultdict(list) 
page_names = ['Barrel - Part 1', 'Petit Trees (sketch)', 'Island (sketch)'] 
pages = [1, 2, 3] 

for k, v in [(y, x[1]) for x in zip(page_names, pages) for y in x[0].split(' ')]: 
    d[k].append(v) 

また、順序が重要でない場合は、重複したキーでリストを変換します。その後、coolections.defaultdictは非常に便利です。純粋なベースのPythonのアプローチでも動作しますが、次のようなものになります。

d = {} 
for x in l: 
    if x.key not in l: 
     d[x.key] = [] 
    d[x.key].append(x.value) 
関連する問題