Expanding a list of tuples
Possible Duplicate:
join list of lists in python
我有一个这样的列表,其中元组的长度总是相等的:
1
| [(1, 2), (4, 7), (6, 0)] |
产生这个的最Python的方法是什么?
- 拥有10公里以上代表的人怎么能问这个问题,这个问题已经回答了101次了?
- @因为在他的用户页面上有:"语言:?爪哇?C?C++?HTML?CSS?PHP?javascript"->不是python
您可以使用列表理解:
1 2
| my_list = [(1, 2), (4, 7), (6, 0)]
result = [x for t in my_list for x in t] |
或
1
| result = list(itertools.chain.from_iterable(my_list)) |
- 实际上,我的"元组"是从对象生成的。有没有更好的方法来写[x for o in myObjects for x in (o.a, o.b)]?
- @埃里克:一种选择是编写一个函数flatten()(在我的答案中有一个实现)并使用flatten((o.a, o.b) for o in my_objects)。你必须选择你最喜欢的。
- 那我就没办法避免构造元组了?
- @埃里克:当然可以。您可以向对象的类中添加一个__iter__(),实现为yield self.a; yield self.b。或者你可以使用final_list = []; for o in my_objects: final_list.append(o.a); final_list.append(o.b)。有无数的选择,你选择哪一个并不重要。
- 我没想到江户十一〔六〕号。我会坚持用元组。谢谢!
1 2
| my_list = [(1, 2), (4, 7), (6, 0)]
print sum(my_list,()) |
结果
- 这有二次运行时,应该避免。
- @Sven Marnach好的。事实上,我对这些O(1)、O(2)等因素的理解非常少。你怎么知道它是二次的?
- 在每一个步骤中,到目前为止创建的整个元组都需要复制到一个新的元组中,其中包含两个附加项。如果您使用长列表进行此操作,在操作结束时,每添加一个两个项目都是相当昂贵的。你也可以通过测量花费的时间来看到这一点。使用10倍长度的列表将得到100倍运行时间。
- @SvenMarnach我在想,C中的底层进程可以像迭代器一样读取元组中的值,并且只有当所有元素都已累积,而中间元组的长度越来越大时,才能创建最终的元组。谢谢您。
如果不使用python3,
1
| reduce(lambda x,y: x+y, sequence) |
也可以工作。由于reduce()已被移除,里程数可能会因Python的情况而有所不同,但其他解决方案总是不错的。
- 或者,你知道,sum(sequence)。
- 这有O(n^2)复杂性(只是一种写sum(sequence, ())的神秘方式,它也有二次复杂性)。注意,在python 3中,reduce()并没有消失——它只是移动到functools。