【问题标题】:How can you add tuples together in an internal loop? [duplicate]如何在内部循环中将元组添加在一起? [复制]
【发布时间】:2021-07-07 10:55:37
【问题描述】:

我想用简洁的表达式将 list1 中的所有元素添加到一个大元组中。 list2 的输出给出了我想要的表示, 我如何使用 list3 来实现这一点? 如果我有很多内部元组,则 list2 的表达式不方便。

list1 = ((1,2,3),(4,5,6),(7,8,9),(10,11,12))

list2 = tuple(list1[0] + list1[1] + list1[2] + list1[3])

print(list2)

list3 = tuple(list1[i] for i in range(4))

print(list3)

输出列表2:(1、2、3、4、5、6、7、8、9、10、11、12)

输出列表3:((1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12))

我发现 list2 使用加法来添加元组,但 list3 中的 for 循环使用逗号。 有没有办法表明内部for循环必须通过添加来添加元组?

【问题讨论】:

  • @quamrana,是的,谢谢!
  • "但 list3 中的 for 循环使用逗号",没有多大意义。
  • 无论如何,你可能想要tuple(x for tup in list1 for x in tup)

标签: python


【解决方案1】:

内联 for 循环将始终创建与您在 in 之后放置的元素一样多的元素。

为了快速获得所需的结果,可以使用 reduce 函数将元组相加。

>>> import functools
>>> import operator
>>> functools.reduce(operator.concat, list1)
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

operator.concat 在这种情况下只是一个指定如何处理对象的函数。可以改写成functools.reduce((lambda x,y: x+y), list1)

编辑:对于您的简单问题,上述解决方案将起作用。然而,正如@ShadowRanger 所指出的,这对于更大的输入来说效率并不高。

这是一个示例,说明如何在您的情况下使用 itertools.chain.from_iterable

>>> import itertools
>>> tuple(itertools.chain.from_iterable(list1))
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)

【讨论】:

  • 注意:对于(潜在的)大输入,这是错误的方法;这是Schlemiel the Painter's algorithmitertools.chain.from_iterable 避免了这个问题,没有额外的代码复杂性。
  • 这是一个不必要的低效算法。应该避免这种情况,因为没有二次行为是微不足道的。
  • 谢谢@ShadowRanger - 我用相应的例子编辑了答案
  • @juanpa.arrivillaga 谢谢你的评论。我用一个例子编辑了我的答案,以获得更有效的方法。
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多