我有一个列表
如下:
mylist=[[(1, 1)], [(1, 1), (1, 2)], [(1, 1), (1, 2), (1, 3)], [(1, 1), (1, 2), (1, 4)]]
现在,我想要的是将此列表中的每个元素与所有其他元素进行比较,如果该元素是与之比较的元素的子集,则应将其弹出。例如,[(1, 1)]
是 [(1, 1), (1, 2)]
的子集,然后 [(1, 1 )]
应该从 list
中弹出。同样,[(1, 1), (1, 2)]
是 [(1, 1), (1, 2), (1, 3)]的子集
那么它也应该被弹出。
在这种情况下,我们得到如下输出:
[[(1, 1), (1, 2), (1, 3)], [(1, 1), (1, 2), (1, 4)]]
我尝试搜索所有可能的答案,但没有一个是针对这个特定案例的。
到目前为止,我已经尝试了以下方法,但用处不大:
for i, e in enumerate(mylist):
mylist[i] = tuple(e)
mylist = list(set(mylist))
最佳答案
您需要删除 any
来自 mylist
的列表,其中 all
列表中的元组出现在 mylist
中的另一个列表中。这最容易通过分配给新列表来完成:
newlist = []
for i, lst in enumerate(mylist):
if not any(all(t in l for t in lst) for l in mylist[:i] + mylist[i+1:]):
newlist.append(lst)
或者作为列表理解:
newlist = [lst for i, lst in enumerate(mylist) if not any(all(t in l for t in lst) for l in mylist[:i] + mylist[i+1:])]
在这两种情况下,对于您的示例数据,输出为:
[
[(1, 1), (1, 2), (1, 3)],
[(1, 1), (1, 2), (1, 4)]
]
对于较大的列表,这可能会变慢,在这种情况下,您可以通过首先将 mylist
中的条目映射到集合来加快速度:
mylist=[[(1, 1), (1, 2)], [(1, 1), (1, 2), (1, 3)], [(1, 1), (1, 2), (1, 4)], [(1, 1)]]
mylist=list(map(set, (tuple(l) for l in mylist)))
newlist = [list(lst) for i, lst in enumerate(mylist) if not any(lst.issubset(l) for l in mylist[:i] + mylist[i+1:])]
关于python - 比较列表列表中的元组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67188362/