【问题标题】:How to iterate over a tuple of tuples without flattening如何在不展平的情况下迭代元组的元组
【发布时间】:2019-02-21 18:46:26
【问题描述】:

我想检查一个元组的值。除了检查每个元组的每个值之外,我还需要将一个元组中的最后一个元素与下一个元组中的第一个元素进行比较。

我可以迭代一个元组的元组而不将其展平成一个列表吗?

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

【问题讨论】:

  • 嵌套的for 循环?我们需要更多信息才能从这里开始。
  • 给我们看一些代码,你试过什么?
  • 嘘尝试一下
  • 不要命名变量list、max、min、dict 等等 - 你隐藏了内置函数并遇到问题

标签: python python-3.x iterator tuples


【解决方案1】:

您想要遍历对以允许通过连续元组进行比较,itertool's recipes 建议以下实现。

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 实现的优势在于可以处理任何类型的可迭代对象,包括生成器等消耗品。

【讨论】:

  • 嵌套的 for 循环会是什么样子?我的嵌套 for 循环不允许我跨子元组比较元素
  • @Matt 我错过了这个要求,看看更新的答案。
【解决方案2】:

从第一个元组的最后一个元素开始,然后遍历其余的元组。根据您的问题,这是一个可能的解决方案:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2020-02-26
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多