我有一份清单清单:
a = [[1, 2], [2, 3], [4, 3]]
如何分两步获得以下效果?:
b = [[1, 2, 2, 3], [1, 2, 4, 3], [2, 3, 4, 3]]
b = [[1, 2, 3], [1, 2, 4, 3]]
,意思是:
1.1。如果相同的值出现在彼此相邻的子列表b[i]
中,那么
必须删除其中一个值。
2.2。如果相同的值出现在给定的子列表b[i]
中,但不会出现在每个子列表旁边
另外,必须删除整个子列表b[i]
。
答案 0 :(得分:1)
timegb是对的。优雅的解决方案涉及一些欺骗和欺骗。我会试着打破这些步骤。
itertools.combinations
map
和chain
from itertools import chain, combinations, groupby
out = []
for r in map(lambda x: list(chain.from_iterable(x)), combinations(a, 2)):
j = [i for i, _ in groupby(r)]
if len(j) <= len(set(r)):
out.append(j)
print(out)
[[1, 2, 3], [1, 2, 4, 3]]
如果您只需要第一部分,只需找到组合并展平:
out = list(map(lambda x: list(chain.from_iterable(x)), combinations(a, 2)))
print(out)
[[1, 2, 2, 3], [1, 2, 4, 3], [2, 3, 4, 3]]