2016-11-23 121 views
2

開始形成一個列表:Python的 - 填充的嵌套字典

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

我可以填充每個項目的appearences的數量dictionary

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

,並得到:{'alternative': 1, 'pop': 1, 'rock': 1}

同樣,爲:

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

相同:

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

,並得到:{'indie': 1, 'chamber pop': 1, 'rock': 1},等等。

,但可以說,我想以同樣的方式來填充這個dict

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

我該怎麼辦呢?

回答

1

比方說,你有用戶和列表已經存儲到字典。然後,你可以內dictionary comprehension遍歷所有鍵值對,並使用Counter到列表轉換爲dict與計數:

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})} 

要突破有點users.items()以上返回(key, value)的迭代元組:

>>> 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':'字典(計數器(V))'如果你必須有一個普通的'dict'而不是一個「計數器」。 –

+0

@DanD。很好的補充,通常它並不重要,雖然'Counter'是一個'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',以使其更具可讀性。 –

+0

感謝您的反饋 – Simplans