如何用重复的键值创建字典?

avgjoe567

我有以下宠物清单:

pets = [("Fido", "John", "Malkovic", 22),
    ("Butch", "Jake", "Smirnoff", 18),
    ("Zooma", "Simon", "Ng", 32),
    ("Chase", "Martha", "Black", 73),
    ("Rocky", "Simon", "Ng", 32)]

我需要创建一个函数,该函数接受具有类似结构的列表,并提供一个字典,其中名称,姓氏和年龄用作键,而狗的名字则是一个值。对于此特定列表,答案是

{("John", "Malkovic", 22): ["Fido"],
 ("Jake", "Smirnoff", 18): ["Butch"],
 ("Simon", "Ng", 32): ["Zooma", "Rocky"],
 ("Martha", "Black", 73): ["Chase"]
}

我试图做的是创建一个键列表,创建一个值列表,然后尝试以某种方式将它们放入字典中

q=[]
for i in pets:
    q.append(tuple(i[-3:]))

这一步给了我一个键列表:

[('John', 'Malkovic', 22), ('Jake', 'Smirnoff', 18), ('Simon', 'Ng', 32), ('Martha', 'Black', 73), ('Simon', 'Ng', 32)]

然后创建一个值列表:

b=[]
for i in pets:
    b.append(i[0])

它给了我这个清单:

['Fido', 'Butch', 'Zooma', 'Chase', 'Rocky']

然后尝试使用以下两个列表填充字典:

d=dict(zip(q,b))

但我没有得到我所需要的:

{('John', 'Malkovic', 22): 'Fido', ('Jake', 'Smirnoff', 18): 'Butch', ('Simon', 'Ng', 32): 'Rocky', ('Martha', 'Black', 73): 'Chase'}

首先,此方法不允许我为一个键放置两个值(在这种情况下,我必须将值“ Zooma”和“ Rocky”与键“((Simon”,“ Ng”,32)”)配对,其次,如果包含键的列表具有两个相似的键,则跳过一个值(在这种情况下,它具有(“ Simon”,“ Ng”,32)的两个实例)如何创建这样的字典?

格里斯玛

如果您这样做:

d = dict(zip(q,b))

什么情况是,qb被配对,然后每个条目被视为一个键/值对的字典。如果q条目重复,则意味着同一密钥将被设置两次,其值将被覆盖(不会跳过)。

您希望您的值是值的列表,但是上面的命令会将它们设置为直接值(请注意,在您自己的示例中,宠物不在列表中)。

遵循逻辑直到最后一步的一种解决方案是使用defaultdict列表:

from collections import defaultdict

# ...

d = defaultdict(list)
for person, pet in zip(q, b):
    d[person].append(pet)

defaultdict避免了创建每个值一个新的列表,并创建一个空表添加到每个新的密钥,而只是添加到现有的密钥列表。

但是,一种更简单的方法是一次性创建字典:

from collections import defaultdict

pets = [("Fido", "John", "Malkovic", 22),
    ("Butch", "Jake", "Smirnoff", 18),
    ("Zooma", "Simon", "Ng", 32),
    ("Chase", "Martha", "Black", 73),
    ("Rocky", "Simon", "Ng", 32)]


d = defaultdict(list)
for pet, first, last, age in pets:
    d[(first, last, age)].append(pet)

或者,如果您真的不想要defaultdict

d = {}
for pet, first, last, age in pets:
    key = (first, last, age)
    if key not in d:
        d[key] = []
    d[key].append(pet)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章