【问题标题】:Python: Difference in iteration over tuple and list in list-comprehension?Python:列表理解中元组和列表的迭代差异?
【发布时间】:2020-05-19 10:55:30
【问题描述】:

我的目标:了解为什么以下函数“更改”对于输入“单个元组的列表”和“单个元组的元组”的行为不同。

我在不同程序的“更改”中使用列表推导式,惊讶地发现两个输入的行为不同。

def change(entries):
    return ['\t'.join(entry) for entry in entries]

entry_tuple_list = [('val1', 'val2')]
print(change(entry_tuple_list)) #Evaluates to ['val1\tval2']

entry_tuple_tuple = (('val1', 'val2')) 
print(change(entry_tuple_tuple)) #Evaluates to ['v\ta\tl\t1', 'v\ta\tl\t2']

expected_result = ['val1\tval2']

我希望 both entry_tuple_listentry_tuple_tuple 在函数中显示相同的行为并变成 ['val1\tval2']expected_result

您在 code-cmets 中看到的情况并非如此。 为什么这两个输入会导致不同的输出?

【问题讨论】:

标签: python python-3.x list tuples list-comprehension


【解决方案1】:

拥有这个(()) 并不意味着你拥有2 tuples。让我们了解这里发生了什么:

这个entry_tuple_tuple[0] 将输出val1

而这个entry_tuple_list[0] 将输出('val1', 'val2')

那么这里有什么问题吗?事实上,在 python 中,如果你想拥有一个元组,那么你应该拥有,

例如,在这里,a = (12) 是一个整数,而不是您所期望的元组。要使它成为一个元组,你可以这样做a = 12,。现在a 是一个元组,你猜怎么着!你甚至不需要()

要解决您的问题,只需在此处添加,entry_tuple_tuple = (('val1', 'val2'),)。这应该可以让你得到你想要的嵌套元组。我希望你现在得到它。

【讨论】:

  • 谢谢!我不知道 tuple-syntax 可能会那么棘手,可以清除它。我正要问你是否可能知道为什么 a = (12) 不计算为元组......然后我意识到这意味着你为了人类可读性而放在括号周围的所有内容都会变成一个元组和回答了我自己的问题。
  • 没错,() 只是告诉你,嘿,这可能是一个元组!
【解决方案2】:

因为您的 entry_tuple_tuple = (('val1', 'val2')) 不是元组的元组。要让 python 知道您想要一个单元素元组,请插入逗号,即将该行更改为 entry_tuple_tuple = (('val1', 'val2'),) 会产生预期的结果。

就目前而言,它只是拾取具有两个值的单个元组。您的理解是遍历这两个值中的每个字符。

【讨论】:

  • 谢谢!在这种情况下,元组语法并不完全符合我的预期,感谢您为我解决这个问题!
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
相关资源
最近更新 更多