У меня есть набор кортежей в виде списка:

[(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: (заголовок грязный, но я не знаю, как объяснить лучше (буду рад редактировать).

1
David Pekker 20 Авг 2018 в 15:15

3 ответа

Лучший ответ

Опираясь на мой наивный подход комментарий:

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

Это объединяет элементы из соседних пар и, таким образом, гарантирует, что ни одна пара не будет в исходном списке

7
schwobaseggl 20 Авг 2018 в 12:25

Вот идея с использованием 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)]
1
jpp 20 Авг 2018 в 12:26

Ну, вот один. Я мог бы неправильно понять ваш первоначальный вопрос.

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]
0
Noufal Ibrahim 20 Авг 2018 в 12:26
51930542