Python中元组中的所有项目[重复]
Posted
技术标签:
【中文标题】Python中元组中的所有项目[重复]【英文标题】:All items from a tuple in Python [duplicate] 【发布时间】:2013-10-22 18:03:50 【问题描述】:我有一个元组,它由一些整数元组和一些整数组成,比如((1, 2), 3, (4, 5), 6)
。现在我需要它的所有整数。我写道:
def get_all_items(iterable):
t = []
for each in iterable:
if type(each) == int:
t.append(each)
else:
t.extend(each)
return tuple(t)
它对我有用。有没有更好的方法来做到这一点?
【问题讨论】:
你确定只有一个层次结构,即你没有一个元组元组的元组吗? 【参考方案1】:不要忘记作弊方式
>>> from ast import literal_eval
>>> t = ((1, 2), 3, (4, 5), 6)
>>> literal_eval(repr(t).translate(None, '()'))
(1, 2, 3, 4, 5, 6)
【讨论】:
代码让我发笑的情况并不多见……我认为吸引我的是“作弊方式”【参考方案2】:我认为你的方式很好。这是另一种使用递归的方法,它适用于任意深度嵌套的可迭代结构:
def get_all_items(iterable):
try:
result = []
for element in iterable:
result += detuple(element)
return result
except TypeError:
return [iterable]
此外,了解您所描述的操作称为“扁平化”数据结构可能会很有用。
【讨论】:
【参考方案3】:from itertools import chain
def flatten(items):
def renest():
for item in items:
try:
yield iter(item)
except TypeError:
yield iter([item])
return list(chain.from_iterable(renest()))
【讨论】:
@DSM 是的,我忘了itertools
不是魔法。
很容易忘记,因为它经常如此。 :^)【参考方案4】:
import itertools
itertools.chain.from_iterable(
item if hasattr(item, '__iter__') else (item,)
for item in iterable
)
【讨论】:
【参考方案5】:你可以像这样简化你的代码
def get_all_items(iterable):
t = []
for each in iterable:
t.extend(list(each) if isinstance(each, tuple) else [each])
return tuple(t)
print get_all_items(((1, 2), 3, (4, 5), 6))
输出
(1, 2, 3, 4, 5, 6)
【讨论】:
以上是关于Python中元组中的所有项目[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:如何分组并为组中的所有项目分配 id?