元组对列表的列表

时间:2016-11-22 14:48:17

标签: python python-3.x dictionary tuples

我在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"}}

有任何帮助吗?谢谢。如果有人在某个地方对词典进行了很好的介绍,我将不胜感激。我只是想不出来。

2 个答案:

答案 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"}}