将列表中的内容合并到嵌套字典中
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})})
>>>
在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})})
>>>