我有以下宠物清单:
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))
什么情况是,q
和b
被配对,然后每个条目被视为一个键/值对的字典。如果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] 删除。
我来说两句