对列表中的子列表的操作

时间:2017-11-20 06:38:41

标签: python list

我有一份清单清单:

a = [[1, 2], [2, 3], [4, 3]]

如何分两步获得以下效果?:

  1. b = [[1, 2, 2, 3], [1, 2, 4, 3], [2, 3, 4, 3]]
  2. b = [[1, 2, 3], [1, 2, 4, 3]],意思是:

    1.1。如果相同的值出现在彼此相邻的子列表b[i]中,那么    必须删除其中一个值。

    2.2。如果相同的值出现在给定的子列表b[i]中,但不会出现在每个子列表旁边    另外,必须删除整个子列表b[i]

1 个答案:

答案 0 :(得分:1)

timegb是对的。优雅的解决方案涉及一些欺骗和欺骗。我会试着打破这些步骤。

  • 使用itertools.combinations
  • 查找输入的所有2种组合
  • 展开与mapchain
  • 的返回组合 每个组合
  • ,按连续元素分组
  • 通过长度检查,只保留满足您条件的那些。
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]]