Warm tip: This article is reproduced from serverfault.com, please click

python-创建一个名字为键的字典,与该键关联的全名为值

(python - create a dict with first name as key, full name associated with the key as value)

发布于 2018-12-21 16:59:14

我有一个清单:

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

谢谢。

Questioner
potentialwjy
Viewed
11
Patrick Artner 2018-12-22 01:25:49

聪明的方法(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)
  • 对于我们刚刚收集的每个名称,它会再次遍历完整列表以创建dict值 [n for n in name_list if n.startswith(key)]

如果你需要事后排序,只需list.sort()dicts值使用即可

# 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']}