将列表中的内容合并到嵌套字典中

Merge content in a list into a nested dictionary

在text.txt中是:

Tommy 1200
Sally 1500
Ricky 2030
Tommy 3200
Sally 2900
Tommy 2190
Tommy 3460

我想将内容合并到字典中,所以结果如下:

{'Tommy':[1200,3200,2190,3460],
 'Sally':[1500,2900],
 'Ricky':[2030]}

到目前为止,这是我的代码:

dic = {}
name_score = []
with open('text.txt','r') as f:
    lines = f.readlines()

for line in lines:
    line = line.strip().split(' ')
    name_score.append([line[0],line[1]])
print(name_score)

输出:

[['Tommy', '1200'], ['Sally', '1500'], ['Ricky', '2030'], ['Tommy', '3200'], ['Sally', '2900'], ['Tommy', '2190'], ['Tommy', '3460']]

我已经尝试了更多,但事情对我来说太混乱了。我能得到一些帮助吗?

遍历您的 ns 列表。对于每个条目,检查第一个值是否已经不是 dic 中的键。如果不是,则在该键下向 dic 添加一个空列表。然后,将条目中的第二个值附加到 dic.

中的该列表
for l in ns:
    if l[0] not in dic:
        dic[l[0]] = []
    dic[l[0]].append(l[1])

正如 @Ch3steR 在评论 (+1) 中指出的那样,这是 defaultdict 的完美用法:

from collections import defaultdict

name_score = defaultdict(list)

with open('test.txt') as file:
    for line in file:
        name, score = line.strip().split()
        name_score[name].append(score)

print(name_score)

输出

> python3 test.py
defaultdict(<class 'list'>, {'Tommy': ['1200', '3200', '2190', '3460'], 'Sally': ['1500', '2900'], 'Ricky': ['2030']})
>

A defaultdict 可以像字典一样使用。如果 defaultdict(<class 'list'> 的东西在输出中困扰你,你可以在 defaultdict:

上调用 dict
 print(dict(name_score))

输出

> python3 test.py
{'Tommy': ['1200', '3200', '2190', '3460'], 'Sally': ['1500', '2900'], 'Ricky': ['2030']}
>

取回通用dict。但是 Pythonic 要做的就是使用 defaultdict 并且不要被它的打印方式打扰。

有一些技巧可以用通用 dict 做大致相同的事情,例如使用 setdefault()defaultdict 是一种清晰且易于理解的方法。你可以用它做一些疯狂的事情,比如 defaultdict(lambda: defaultdict(int)) -- 一个自动创建的整数字典!

>>> x = defaultdict(lambda: defaultdict(int))
>>> x['squirrel']['nuts_found'] += 1
>>> x
defaultdict(<function <lambda> at 0x10c285b80>, {'squirrel': defaultdict(<class 'int'>, {'nuts_found': 1})})
>>>