包含原始集中没有匹配项的对的列表列表



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

[(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)]

创建ba的元组列表的方法是什么,这样就不会有原始元组?

所以例如

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

还可以,但是

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

不行,因为它包含(1, 2)(5, 6)a

PS:(标题乱七八糟,但我不知道如何更好地解释(很乐意编辑(。

基于我幼稚的方法评论:

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)]

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

这是一个使用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)]

嗯,这里有一个。不过,我可能误解了您最初的问题。

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]

最新更新