【问题标题】:Expanding a list of tuples [duplicate]扩展元组列表[重复]
【发布时间】:2012-01-18 21:00:00
【问题描述】:

可能重复:
join list of lists in python

我有一个这样的列表,其中元组的长度总是相等的:

[(1, 2), (4, 7), (6, 0)]

最pythonic的生成方式是什么?

[1, 2, 4, 7, 6, 0]

【问题讨论】:

  • 拥有 10k+ 代表的人怎么能问这个问题,这个问题已经在 SO 上回答了 101 次?
  • @wim 因为在他的用户页面上有:"语言:•Java •C •C++ •HTML •CSS •PHP •Javascript" -> 不是 Python

标签: python


【解决方案1】:

您可以使用list comprehension

my_list = [(1, 2), (4, 7), (6, 0)]
result = [x for t in my_list for x in t]

result = list(itertools.chain.from_iterable(my_list))

【讨论】:

  • 事实上,我的“元组”是由对象生成的。有没有更好的写法[x for o in myObjects for x in (o.a, o.b)]
  • @Eric:一种选择是编写一个函数flatten()(使用我的答案中的一种实现)并使用flatten((o.a, o.b) for o in my_objects)。您必须选择自己最喜欢的东西。
  • 那我就无法避免构造元组了吗?
  • @Eric:当然可以。您可以将__iter__() 添加到对象的类中,实现为yield self.a; yield self.b。或者你可以使用final_list = []; for o in my_objects: final_list.append(o.a); final_list.append(o.b)。有无数的选择,你选择哪一个其实并不重要。
  • 我没想到__iter__。我会坚持使用元组。谢谢!
【解决方案2】:

如果您使用的不是 Python 3,

reduce(lambda x,y: x+y, sequence)

也可以。自从 reduce() 被删除以来,它的 Pythonic 程度可能会有所不同,但替代解决方案总是不错的。

【讨论】:

  • 或者,你知道的,sum(sequence)
  • 这具有 O(n^2) 复杂度(并且只是写 sum(sequence, ()) 的一种神秘方式,它也具有二次复杂度)。请注意,reduce() 在 Python 3 中并没有消失——它只是移到了functools
【解决方案3】:
my_list = [(1, 2), (4, 7), (6, 0)]
print sum(my_list,())

结果

(1, 2, 4, 7, 6, 0)

【讨论】:

  • 这具有二次运行时间,应该避免。
  • @Sven Marnach 好的。事实上,我对这些 O(1) 、 O(2) 等注意事项知之甚少。请问你怎么知道它是二次的?
  • 在每一步中,到目前为止创建的整个元组都需要复制到一个带有两个附加项的新元组中。如果您使用长列表执行此操作,则在操作结束时,每次添加两个项目都会非常昂贵。您还可以通过测量所花费的时间来了解这一点。 Using a list of ten times the length result in hundred times the run time.
  • @Sven Marnach 我在想 C 中的底层进程可以像迭代器一样读取元组中的值,并且只有在所有元素都被累积而不产生中间元组时才创建最终元组越来越长。谢谢。
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 2015-07-11
  • 2015-02-11
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多