我有一组列表形式的元组:
[(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:(标题乱七八糟,但我不知道如何更好地解释(很乐意编辑(。
基于我幼稚的方法评论:
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.deque
和itertools
的想法。这个想法是展平,旋转,然后分成对。假设您不需要对结果进行任何排序。
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]