我有一个字典,其中列出了图像ID列表,这些ID属于一类图像,例如狗和猫。有些图像在图像中同时包含狗和猫,因此我想删除这些图像。
我说我有
{'cat':[1,2,3], 'dog':[2,3,4]}
我们可以看到ID为2和3的图像既有猫又有狗。我想排除这些图像以获得以下信息:
[[1],[4]]
到目前为止,我已经尝试过:
from collections import Counter
img_ids = {'cat':[1,2,3], 'dog':[2,3,4]}
flattened = [item for sublist in img_ids.values() for item in sublist]
flattened_unique = [k for k, v in dict(Counter(flattened)).items() if v < 2]
filtered_ids_dfs = []
for key, val in img_ids.items():
filtered = [x for x in val if x in flattened_unique]
filtered_ids_dfs.append(filtered)
print(filtered_ids_dfs)
是否有更好或更优雅的解决方案?另外,可能有任意多个类,因此我们的词典中可能包含猫,狗,鸡等。
答案 0 :(得分:5)
首先,计算每个图像有多少个对象(例如猫,狗)。然后查找仅具有一个对象的图像(唯一图像)。最后,使用字典理解来查找唯一图像列表中的图像。
django
答案 1 :(得分:5)
只需使用集:
d = {'cat':[1,2,3], 'dog':[2,3,4]}
common = set(d['cat']) & set(d['dog'])
out = [list(set(d['cat']) - common), list(set(d['dog']) - common)]
将此扩展到两个以上的键:
common = set.intersection(*(set(v) for k,v in d.items()))
out = [list(set(v) - common) for k,v in d.items()]
答案 2 :(得分:3)
您可以使用列表理解:
d = {'cat':[1,2,3], 'dog':[2,3,4]}
n = [[c for c in b if not any(c in h for j, h in d.items() if j != a)] for a, b in d.items()]
输出:
[[1], [4]]