2016-11-23 5 views
2

移入:パイソン - フォームにリストスタートネストされた辞書

user1 = ['alternative', 'rock', 'pop'] 

私は、各項目のappearencesの数とdictionaryを移入することができます。用{'alternative': 1, 'pop': 1, 'rock': 1}

同様に、::同じ

user2 = ['indie', 'rock', 'chamber pop'] 

u1={} 
for tag in user1: 
    u1[tag]=1 
print u1 

とget

u2={} 
    for tag in user2: 
     u2[tag]=1 
    print u2 

とget:{'indie': 1, 'chamber pop': 1, 'rock': 1}を、というように。

が、私は同じように、このdictを移入したいと言うことができます:

users = { 
     u1:{}, 
     u2:{}, 
     u3:{}, 
     ... 
     ... 
     } 

私はそれをどのように行うことができますか?

答えて

1

ユーザーとリストが既に辞書に保存されているとします。そして、あなたはdictionary comprehension内のすべてのキーと値のペアを反復処理し、カウントしてdictにリストを変換するCounterを使用することができます。

from collections import Counter 

users = { 
    'u1': ['alternative', 'rock', 'pop'], 
    'u2': ['indie', 'rock', 'chamber pop'], 
    'u3': ['indie', 'rock', 'alternative', 'rock'] 
} 

res = {k: Counter(v) for k, v in users.items()} 
print(res) 

は出力:

{'u1': Counter({'alternative': 1, 'pop': 1, 'rock': 1}), 
'u3': Counter({'rock': 2, 'indie': 1, 'alternative': 1}), 
'u2': Counter({'indie': 1, 'chamber pop': 1, 'rock': 1})} 

(key, value)の反復可能なを返しusers.items()ビットの上に解除するにはタプル:

>>> list(users.items()) 
[('u2', ['indie', 'rock', 'chamber pop']), ('u1', ['alternative', 'rock', 'pop']), ('u3', ['indie', 'rock', 'alternative', 'rock'])] 

次に、dictの理解によってリストがに変わりますの含有カウント:

>>> Counter(['indie', 'rock', 'chamber pop']) 
Counter({'rock': 1, 'indie': 1, 'chamber pop': 1}) 
各ユーザ名の最後

Counterを得、結果dictに添加されます。

+0

あなたは 'カウンターをラップすることができます(V)' dict' 'と'のdict(カウンター(V)) 'あなたはプレーン' dict'を持っている必要がある場合とありません「カウンター」。 –

+0

@DanD。良いことに、一般的にそれは重要ではありません。なぜなら、「Counter」は「dict」であり、ほぼすべてのシナリオでは「Dict」のように動作します。ありがとう。 – niemmi

+0

ありがとう。この手法は長期的にはより有用です。実際には –

1

Counterは良い選択です。しかし、この質問によれば、よりシンプルな選択肢を使うことができます。これをチェックしてください。

users = { 
    'u1': ['alternative', 'rock', 'pop'], 
    'u2': ['indie', 'rock', 'chamber pop'], 
} 

res = {} 
for user in users.items():   # return each key:value pair as tuple 
    res[user[0]] = {}    # first element of tuple used as key in `res` for each list 
    for tag in user[1]:    # return each element of list 
     res[user[0]][tag] = 1  # assign value as 1 of each element. 

print res 

出力:

{'u1': {'alternative': 1, 'pop': 1, 'rock': 1}, 'u2': {'indie': 1, 'chamber pop': 1, 'rock': 1}} 
+0

が簡単です。私はそれをより読みやすくするために、 'list_user'の代わりに 'genre'や 'tag'を使うだけです。 –

+0

フィードバックに感謝いたします – Simplans

関連する問題