我有一个清单:
name_list = ["David Joyner", "David Zuber", "Brenton Joyner",
"Brenton Zuber", "Nicol Barthel", "Shelba Barthel",
"Shelba Crowley", "Shelba Fernald", "Shelba Odle",
"Shelba Fry", "Maren Fry"]
我想编写一个函数以返回以名字为键的字典,所有与名字相关的全名作为值:
{'Shelba': ['Shelba Barthel', 'Shelba Crowley', 'Shelba Fernald',
'Shelba Odle', 'Shelba Fry'], 'David': ['David Joyner', 'David Zuber'],
'Brenton': ['Brenton Joyner', 'Brenton Zuber'], 'Maren': ['Maren Fry'],
'Nicol': ['Nicol Barthel']}
谢谢。
聪明的方法(1条通过你的列表):
from collections import defaultdict
name_list = ["David Joyner", "David Zuber", "Brenton Joyner",
"Brenton Zuber", "Nicol Barthel", "Shelba Barthel",
"Shelba Crowley", "Shelba Fernald", "Shelba Odle",
"Shelba Fry", "Maren Fry"]
rv = defaultdict(list)
for elem in name_list:
rv[elem.split()[0]].append(elem)
print(dict(rv))
输出:
{'David': ['David Joyner', 'David Zuber'],
'Brenton':['Brenton Joyner', 'Brenton Zuber'],
'Nicol': ['Nicol Barthel'],
'Shelba': ['Shelba Barthel','Shelba Crowley','Shelba Fernald','Shelba Odle','Shelba Fry'],
'Maren': ['Maren Fry']}
慢速方式(可能看起来不错,但效率低下):
d = {key:[n for n in name_list if n.startswith(key)]
for key in set( p.split()[0] for p in name_list)}
与defaultdict
版本相比,这在计算上要差得多,因为它多次遍历列表:
set( p.split()[0] for p in name_list)
[n for n in name_list if n.startswith(key)]
如果你需要事后排序,只需list.sort()
在dict
s值上使用即可:
# sorting the data afterwards
for k in rv:
rv[k].sort(key = lambda x:x.split()[1]) # to sort by last names
输出:
# only difference when sorted: see key `Shelba`
{'David': ['David Joyner', 'David Zuber'],
'Brenton':['Brenton Joyner', 'Brenton Zuber'],
'Nicol': ['Nicol Barthel'],
'Shelba': ['Shelba Barthel','Shelba Crowley','Shelba Fernald','Shelba Fry','Shelba Odle'],
'Maren': ['Maren Fry']}