在原始集合中不具有对的列表列表

时间:2018-08-20 12:15:17

标签: python combinations list-comprehension

我有一组以列表形式的元组:

[(1, 2), (3, 4), (5, 6), (7, 8)]

按这种顺序不是必需的,也可以是:

[(1, 4), (2, 6), (3, 5), (7, 8)]

这些列表具有两个属性:

  • 如果对其进行了排序和展平,则它们的范围从1到n(例如[1, 2, 3,..n]
  • n是偶数
  • n大于2

  • 所有值都是唯一的(不会重复任何值)。

所以,假设我有:

a = [(1, 2), (3, 4), (5, 6), (7, 8)]

如何创建b中的元组列表a,以使其中没有原始元组?

例如

b = [(1, 8), (3, 7), (2, 6), (4, 5)]

可以,但是

b = [(1, 2), (3, 7), (5, 6), (4, 8)]

不合适,因为它包含(1, 2)中出现的(5, 6)a

PS:(标题很杂乱,但我不知道如何更好地解释(很高兴进行编辑)。

3 个答案:

答案 0 :(得分:7)

以我幼稚的方法为基础:

a = [(1, 2), (3, 4), (5, 6), (7, 8)]
b = [(x[1], y[0]) for x, y in zip(a, a[1:]+a[:1])]
# [(2, 3), (4, 5), (6, 7), (8, 1)]

这会将相邻对中的元素配对,从而确保原始列表中没有对

答案 1 :(得分:1)

这是使用collections.dequeitertools的想法。想法是将其展平,旋转然后分成几对。假设您不需要对结果进行任何排序。

a = [(1, 2), (3, 4), (5, 6), (7, 8)]

from itertools import chain, islice
from collections import deque

dq = deque(chain.from_iterable(a))
dq.rotate()

res = list(zip(islice(dq, 0, None, 2), islice(dq, 1, None, 2)))

print(res)

[(8, 1), (2, 3), (4, 5), (6, 7)]

答案 2 :(得分:0)

这是一个。不过,我可能会误解您的原始问题。

l = [(1, 2), (3, 4), (5, 6), (7, 8)]
m = max(itertools.chain(*l)) # Largest number in input
nos = range(1, m) # List of numbers we can pick from.
all_tuples = set(itertools.combinations(nos, 2)) # All possible tuples
not_in_original = all_tuples - set(l)

这是测试

[x in l for x in not_in_original]
[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]