我有一个列表:
a = [[2,3,4],[2,3,4],[2,3],[1,5,4],[1,5]]
我想得到:
b = [[2,3,4],[1,5,4]]
[2,3,4]
是重复的,[2,3], [1,5]
已完全包含在[2,3,4]
[1,5,4]
中,所以我想将其删除
我使用set(frozenset(x) for x in a)
删除重复项,但是我被如何删除[p2,3],[1,5]困住了,这些[2,3],[1,5]包含在一个子列表中
答案 0 :(得分:0)
您可以将a
中的子列表转换为集合,并按相反的长度对其进行排序,以便您可以遍历它们并将每个集合添加到输出中(如果它不是任何子集的子集)输出中的现有集合:
output = []
for candidate in sorted(map(set, a), key=len, reverse=True):
if not any(candidate <= incumbent for incumbent in output):
output.append(candidate)
list(map(list, output))
返回:
[[2, 3, 4], [1, 4, 5]]
但是,集合是无序的,因此,如果子列表中的原始项目顺序很重要,则您可以利用以下事实:从python 3.7开始就对dict键进行了排序,并将子列表映射到dict键: / p>
output = []
for candidate in sorted(map(dict.fromkeys, a), key=len, reverse=True):
if not any(candidate.keys() <= incumbent.keys() for incumbent in output):
output.append(candidate)
使list(map(list, output))
返回:
[[2, 3, 4], [1, 5, 4]]
如果使用的Python 3.6或更早版本不能保证字典键的顺序,则可以使用collections.OrderedDict
来代替字典。