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

问题描述 投票:2回答:2

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

我做了进一步尝试,但是事情对我来说太混乱了。我可以帮忙吗?

python list dictionary text mergesort
2个回答
1
投票

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

for l in ns:
    if l[0] not in dic:
        dic[l[0]] = []
    dic[l[0]].append(l[1])

1
投票

这是defaultdict的完美用法,用作注释(+1)中的@ Ch3steR注释:

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'>东西在输出中困扰您,则可以在dict上调用defaultdict

 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})})
>>> 
© www.soinside.com 2019 - 2024. All rights reserved.