我在Python中遇到字典问题。我意识到任务很简单,但我无法弄清楚。我的任务是编写一个函数,它将元组列表转换为字典,其中字典的键代表人(来自元组),值代表他们的朋友。每期:
pairs_of_people = {("Adam", "Brian"), ("Adam", "Gabe"), ("Adam", "Hagan"),
("Brian", "Calvin"), ("Brian", "Hagan"),
("Calvin", "Dan")}`
必须返回:
{"Adam": {"Brian", "Gabe", "Hagan"}, "Brian": {"Adam", "Hagan", "Calvin"}, "Calvin": {"Brian", "Dan"}}
有任何帮助吗?谢谢。如果有人在某个地方对词典进行了很好的介绍,我将不胜感激。我只是想不出来。
答案 0 :(得分:2)
通过使用defaultdict
并使用sets
作为默认工厂来构建包含set
(显然)的dict更容易:
from collections import defaultdict
d = defaultdict(set)
此外,使用set
的辅助names
包含每个元组的名字。这样你可以检查会员资格,如果两个对是names
集中的名字,他们将被添加到彼此产生的集合中:
names = {i[0] for i in pairs_of_people}
for i, j in pairs_of_people:
d[i].add(j)
if j in names:
d[j].add(i)
d = dict(d) # if necessarily a dict
defaultdict
只是一种特殊的词典,它使这些任务变得不那么乏味。现在,d
包含:
print(d)
{'Brian': {'Hagan', 'Adam', 'Calvin'}, 'Adam': {'Hagan', 'Brian', 'Gabe'}, 'Calvin': {'Brian', 'Dan'}}
由于您的元组包含在一个集合中,您无法预定排序,除非您将它们移动到列表然后对它们进行排序。您也可以将defaultdict
更改为包含d = defaultdict(list)
的默认工厂列表,并使用d[i].append(j)
和d[j].append(i)
代替.add
。
关于词典的介绍,您可以查看Python Tutorial的词典部分。
答案 1 :(得分:2)
一种非常快速的方法来强制使用此解决方案是使用defaultdict。 这将在我们的输出词典中添加人和他们的朋友,如果他们是" person"或者#34;朋友"是必需的键(输入元组中的第一个人)。
from collections import defaultdict
pairs_of_people = {("Adam", "Brian"), ("Adam", "Gabe"), ("Adam", "Hagan"),
("Brian", "Calvin"), ("Brian", "Hagan"),
("Calvin", "Dan")}
required_keys = {t[0] for t in pairs_of_people}
out = defaultdict(set)
for person, friend in pairs_of_people:
if person in required_keys:
out[person].add(friend)
if friend in required_keys:
out[friend].add(person)
print(out)
>> {"Adam": {"Brian", "Gabe", "Hagan"}, "Brian": {"Adam", "Hagan", "Calvin"},
"Calvin": {"Brian", "Dan"}}