我有一组以列表形式的元组:
[(1, 2), (3, 4), (5, 6), (7, 8)]
按这种顺序不是必需的,也可以是:
[(1, 4), (2, 6), (3, 5), (7, 8)]
这些列表具有两个属性:
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:(标题很杂乱,但我不知道如何更好地解释(很高兴进行编辑)。
答案 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.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)]
答案 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]