从 python 中的字典中删除多个键值对
Deleting multiple key value pairs from dictionary in python
我为一个文件夹中的所有重复图像生成了一个 python 字典。 python 字典现在包含以下格式的值:
{
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_xyz.jpg": ["image_1.jpg", "image_abc.jpg"],
"image_abc.jpg": ["image_xyz.jpg","image_1.jpg"],
"image_2.jpg": ["image_3.jpg"],
"image_3.jpg": ["image_2.jpg"],
"image_5.jpg": []
}
每个键值对因此在列表中至少出现两次。存在没有重复项的空键列表。
有没有办法删除所有存在的重复键值对?这样字典看起来像下面这样:
{
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_2.jpg": ["image_3.jpg"],
"image_5.jpg": []
}
我尝试使用列表首先存储键值对中的所有值,然后从字典中删除它们,但它清空了整个字典。
我通常在删除列表中的重复项时使用此方法:
首先将所有值放入矩阵/二维列表中,包括键,因此前 3 个值将如下所示:
{
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_xyz.jpg": ["image_1.jpg", "image_abc.jpg"],
"image_abc.jpg": ["image_xyz.jpg","image_1.jpg"],
}
会变成:
List=[
["image_1.jpg","image_xyz.jpg","image_abc.jpg"],
["image_xyz.jpg","image_1.jpg","image_abc"],
["image_abc.jpg","image_xyz.jpg","image_1.jpg"]
]
确保密钥都在第 0 个位置,以便您可以保存它们。
keys=[x[0] for x in List]
然后对列表进行排序:
sorted_list=[sorted(x) for x in List]
然后在嵌套的 for 循环中使用 if 语句简单地比较它们,如果一个列表与另一个列表相等,则将其删除:
for i in sorted_list:
for j,k in enumerate(sorted_list):
if i==k:
del sorted_list[j] # deleting any equal lists
现在重复项已经消失,如果愿意,您可以使用键将列表转换回字典
整体代码(如有需要):
List=[
["image_1.jpg","image_xyz.jpg","image_abc.jpg"],
["image_xyz.jpg","image_1.jpg","image_abc"],
["image_abc.jpg","image_xyz.jpg","image_1.jpg"]
]
keys=[x[0] for x in List]
sorted_list=[sorted(x) for x in List]
for i in sorted_list:
for j,k in enumerate(sorted_list):
if i==k:
del sorted_list[j] # deleting any equal lists
source = {
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_xyz.jpg": ["image_1.jpg", "image_abc.jpg"],
"image_abc.jpg": ["image_xyz.jpg","image_1.jpg"],
"image_2.jpg": ["image_3.jpg"],
"image_3.jpg": ["image_2.jpg"],
"image_5.jpg": []
}
dest = dict()
for k,v in source.items():
ok = True
for k1,v1 in dest.items():
if k in v1: ok = False
if ok: dest[k] = v
print(dest) # New filtered dict
我为一个文件夹中的所有重复图像生成了一个 python 字典。 python 字典现在包含以下格式的值:
{
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_xyz.jpg": ["image_1.jpg", "image_abc.jpg"],
"image_abc.jpg": ["image_xyz.jpg","image_1.jpg"],
"image_2.jpg": ["image_3.jpg"],
"image_3.jpg": ["image_2.jpg"],
"image_5.jpg": []
}
每个键值对因此在列表中至少出现两次。存在没有重复项的空键列表。 有没有办法删除所有存在的重复键值对?这样字典看起来像下面这样:
{
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_2.jpg": ["image_3.jpg"],
"image_5.jpg": []
}
我尝试使用列表首先存储键值对中的所有值,然后从字典中删除它们,但它清空了整个字典。
我通常在删除列表中的重复项时使用此方法:
首先将所有值放入矩阵/二维列表中,包括键,因此前 3 个值将如下所示:
{
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_xyz.jpg": ["image_1.jpg", "image_abc.jpg"],
"image_abc.jpg": ["image_xyz.jpg","image_1.jpg"],
}
会变成:
List=[
["image_1.jpg","image_xyz.jpg","image_abc.jpg"],
["image_xyz.jpg","image_1.jpg","image_abc"],
["image_abc.jpg","image_xyz.jpg","image_1.jpg"]
]
确保密钥都在第 0 个位置,以便您可以保存它们。
keys=[x[0] for x in List]
然后对列表进行排序:
sorted_list=[sorted(x) for x in List]
然后在嵌套的 for 循环中使用 if 语句简单地比较它们,如果一个列表与另一个列表相等,则将其删除:
for i in sorted_list:
for j,k in enumerate(sorted_list):
if i==k:
del sorted_list[j] # deleting any equal lists
现在重复项已经消失,如果愿意,您可以使用键将列表转换回字典
整体代码(如有需要):
List=[
["image_1.jpg","image_xyz.jpg","image_abc.jpg"],
["image_xyz.jpg","image_1.jpg","image_abc"],
["image_abc.jpg","image_xyz.jpg","image_1.jpg"]
]
keys=[x[0] for x in List]
sorted_list=[sorted(x) for x in List]
for i in sorted_list:
for j,k in enumerate(sorted_list):
if i==k:
del sorted_list[j] # deleting any equal lists
source = {
"image_1.jpg": ['image_xyz.jpg', 'image_abc.jpg'],
"image_xyz.jpg": ["image_1.jpg", "image_abc.jpg"],
"image_abc.jpg": ["image_xyz.jpg","image_1.jpg"],
"image_2.jpg": ["image_3.jpg"],
"image_3.jpg": ["image_2.jpg"],
"image_5.jpg": []
}
dest = dict()
for k,v in source.items():
ok = True
for k1,v1 in dest.items():
if k in v1: ok = False
if ok: dest[k] = v
print(dest) # New filtered dict