【问题标题】:List of tuple pairs into dictionary元组对列表到字典中
【发布时间】:2017-04-06 07:24:04
【问题描述】:

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

有什么帮助吗?谢谢你。如果有人对某处的字典有很好的介绍,将不胜感激。我就是想不通。

【问题讨论】:

标签: python python-3.x dictionary tuples


【解决方案1】:

暴力破解此解决方案的一种非常快速的方法是使用默认字典。 如果“人”或“朋友”是必需的键(输入元组中的第一个人),这将把人和他们的朋友添加到我们的输出字典中。

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

【讨论】:

  • 是的,这个有效并且实际上比上面提到的第一个示例更容易理解。谢谢你。 :)
  • 还有一个问题。我将如何做完全相反的事情?换句话说,我将如何将这本新词典重新转换为成对的人?
  • @KevinKlarić 反过来其实更简单:friendships = {"Adam": {"Brian", "Gabe", "Hagan"}, "Brian": {"Adam", "Hagan", "Calvin"}, "Calvin": {"Brian", "Dan"}} ; li = [] ; for person, friends in friendships.items(): for friend in friends: li.append((person, friend))
  • 还有一个问题。虽然您的解决方案确实有效,但它的回报比我必须回报的多(对于手头的任务)。例如,将此 {"A": {"B"}, "B": {"A"}}) 转换为对应仅返回此对 {("A", "B")} 而不是同时返回 A, B and B, A. 另一个例子:这个 {A: {B, C}, B: {A, C}, C: {A, B, D}, D: {C}} 应该返回: {(A, B), (A, C), (B, C), (C, D)}
【解决方案2】:

通过使用defaultdictset 作为默认工厂,构造这个包含sets 的字典(显然)要容易得多:

from collections import defaultdict

d = defaultdict(set) 

另外,使用names 的辅助set 包含每个元组的名字。这样您就可以检查成员资格,如果有两对是 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的字典部分。

【讨论】:

  • 这很好,但我的输出必须与我上面写的顺序完全相同。
  • @KevinKlarić 集合没有排序,字典也没有,在不同的 Python 运行中排序可能不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2016-06-12
  • 2011-01-13
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多