Как перебирать кортеж кортежей без выравнивания - PullRequest
0 голосов
/ 17 сентября 2018

Я хотел бы проверить значения кортежа кортежей.В дополнение к проверке каждого значения каждого кортежа мне нужно также сравнить последний элемент в одном кортеже с первым элементом в следующем кортеже.

Можно ли выполнить итерацию по кортежу кортежей, не сливая его в список?

flattened_tuple = [element for tupl in tupleOfTuples for element in tupl]

for i in range(len(flattened_tuple)-1):
    print(flattened_tuple[i], flattened_tuple[i+1])

Это то, что я придумал, это не сводится в список, но я не могу сравнить последний элемент одного кортежа с первым элементом следующего кортежа:

   for row in tuple_of_tuples:
    for i, element in enumerate(tuple_of_tuples):
        print(row[i], row[i+1])

Для кортежа кортежей: ((0,1,2), (3,4,5), (6,7,8)), я получаю эту ошибку:

0 1
1 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "npuzzle.py", line 67, in goal_test
    print(row[i], row[i+1])
IndexError: tuple index out of range

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Начните с получения последнего элемента первого кортежа, а затем выполните итерации по остальным кортежам. Исходя из вашего вопроса, вот возможное решение:

last_element = tuple_of_tuples[0][-1]
for row in tuple_of_tuples[1:]:
    first_element = row[0]
    # compare first element to last element
    # ...
    last_element = row[-1]
0 голосов
/ 17 сентября 2018

Вы хотите выполнить итерацию по парам, чтобы разрешить сравнение через последовательные кортежи, рецепты itertool предлагают следующую реализацию.

from itertools import tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

for last, nxt in pairwise(tupleOfTuples):
    if last[-1] == nxt[0]:
        ...

Реализация pairwise имеет преимущество работы с любымвид повторяемости, включая расходные материалы, такие как генераторы.

...