创建一个名为key,与key关联的全名为valu的dict

2024-09-27 21:26:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一份清单:

name_list = ["David Joyner", "David Zuber", "Brenton Joyner",
             "Brenton Zuber", "Nicol Barthel", "Shelba Barthel",
             "Shelba Crowley", "Shelba Fernald", "Shelba Odle",
             "Shelba Fry", "Maren Fry"]

我想写一个函数来返回一个以名字为键,所有与名字相关联的全名作为值的字典:

^{pr2}$

谢谢。在


Tags: name名字listdavidnicolshelbafryzuber
3条回答

聪明的方法(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))

输出:

^{pr2}$

慢方式(看起来不错,但效率低下):

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)]

如果以后需要排序,只需在dict的值上使用list.sort()

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

试试这个:

def build_dict(name_list)
result_dict = {}
for name in name_list:
    names = name.split(" ")
    if names[0] in result_dict:
        result_dict[names[0]].append(names[1])
    else:
        result_dict[names[0]] = [names[1]]

return result_dict

其思想是迭代名字列表,将每个名字分成名字和姓氏,看看名字是否在字典中。如果是的话,查找它并将姓氏附加到姓氏列表中。如果不是,则为其分配一个唯一成员为姓氏的列表

正如Patrick Artner在评论中建议的那样,使用defaultdict。这个怎么样:

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"]

name_dict = defaultdict(list)

for first_name in set([name.split()[0] for name in name_list]):
    name_dict[first_name] = [name for name in name_list if name.split()[0] == first_name]

print(name_dict)
#defaultdict(<class 'list'>, {'Maren': ['Maren Fry'], 'David': ['David Joyner', 'David Zuber'], 'Nicol': ['Nicol Barthel'], 'Shelba': ['Shelba Barthel', 'Shelba Crowley', 'Shelba Fernald', 'Shelba Odle', 'Shelba Fry'], 'Brenton': ['Brenton Joyner', 'Brenton Zuber']})

相关问题 更多 >

    热门问题