Python-删除列表之间的非唯一元素

时间:2018-09-18 17:35:00

标签: python

我有一个字典,其中列出了图像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)

是否有更好或更优雅的解决方案?另外,可能有任意多个类,因此我们的词典中可能包含猫,狗,鸡等。

3 个答案:

答案 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]]