我必须编写以下函数(以及尝试编写的函数)。显然我的代码有问题,或者我不会在这里发布:)基于尝试使用它时给我的消息,我知道出了什么问题,并且我理解了什么—编写image_dict [0] [ 1]不起作用,因为密钥不是0。我需要知道确切使用该密钥的方式,但是密钥当然可以是任何东西,所以我想知道是否可以轻松更改代码以使其适用于任何键。例如,我可以在0处放置一些内容,以便它适用于所有键,而不必指定确切的键吗?谢谢!
def create_date_dict(image_dict):
'''(dict) -> dict
Given an image dictionary, return a new dictionary
where the key is a date and the value is a list
of filenames of images taken on that date.
>>> d = {'image1.jpg': ['UTSC', '2017-11-03','Happy Friday']}
>>> date_d = create_date_dict(d)
>>> date_d == {'2017-11-03': ['image1.jpg']}
True
'''
result = {}
for (k, v) in image_dict.items():
result[image_dict[0][1]] = [image_dict[0]]
return result
最佳答案
让我们首先通过示例了解实际问题:
示例代码:
对于这些类型的列表问题,有一种模式:
因此,假设您有一个列表:
a=[(2006,1),(2007,4),(2008,9),(2006,5)]
并且您想要将此转换为字典,作为元组的第一个元素(作为键)和元组的第二个元素。就像是 :
{2008: [9], 2006: [5], 2007: [4]}
但是还有一个陷阱,您还希望那些具有不同值但键相同的键,例如(2006,1)和(2006,5)键相同,但值不同。您希望这些值仅附加一个键,以便预期输出:
{2008: [9], 2006: [1, 5], 2007: [4]}
对于此类问题,我们执行以下操作:
首先创建一个新的字典,然后遵循以下模式:
if item[0] not in new_dict:
new_dict[item[0]]=[item[1]]
else:
new_dict[item[0]].append(item[1])
因此,我们首先检查key是否在新字典中,如果已经存在,则将重复key的值添加到其值中:
完整代码:
a=[(2006,1),(2007,4),(2008,9),(2006,5)]
new_dict={}
for item in a:
if item[0] not in new_dict:
new_dict[item[0]]=[item[1]]
else:
new_dict[item[0]].append(item[1])
print(new_dict)
现在,您的解决方案无需任何外部模块:
d = {'image1.jpg': ['UTSC', '2017-11-03','Happy Friday'], 'image2.jpg': ['UTSC', '2017-09-04','Happy Monday'], 'image3.jpg': ['UTSC', '2017-11-03','Happy Monday']}
def create_date_dict(image_dict):
date_dict={}
for key,value in image_dict.items():
if value[1] not in date_dict:
date_dict[value[1]]=[key] #notice here carefully , we have to store key in list so we can append values to it in else part of condition we did `[key]` , not `key`
elif key not in date_dict[value[1]]:
date_dict[value[1]].append(key)
return date_dict
print(create_date_dict(d))
输出:
{'2017-09-04': ['image2.jpg'], '2017-11-03': ['image3.jpg', 'image1.jpg']}
关于python - 根据先前词典中的值创建新词典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47245545/