如何 return python 中元组中的对象列表?
How can I return a list of objects within a tuple in python?
我对 python 问题有些困惑。我想编写一个函数,该函数 returns 嵌套在一个元组中的所有对象的列表。
例如,我希望能够将元组 (((2,4),6,(9,(3,7))) 转换为 [2,4,6,9,3, 7]. 然而,我真的不确定如何开始,因为元组是不可变的。谢谢!
from re import findall
a = ((143,243),534,((55,356)),645)
print findall('\d+', str(a))
# ['143', '243', '534', '55', '356', '645']
b = ((1,2),5,((5,6)),345)
print findall('\d+', str(b))
# ['1', '2', '5', '5', '6', '345']
您需要将元组的元组展平,请参阅 Flattening a shallow list in Python 和 James Brady 提供的解决方案:
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
这是递归的一个很好的例子 - 虽然 Nicolas 已经有了类似的答案。
我们在这里设置了您提供的元组。我们还设置了一个空列表,您希望在其中包含元组。
函数从元组开始,循环遍历每个元素。如果元素是一个元组,它会再次调用该函数,递归地直到你到达一个非元组。然后将其插入列表。
tup = (((2,4),6,(9,(3,7))))
listversion = []
def loopthroughtup(tup):
for i in tup:
if type(i) == tuple:
print str(i) + " is a tuple"
loopthroughtup(i)
else:
print str(i) + " is not a tuple"
listversion.append(i)
loopthroughtup(tup)
print listversion
一个非常基本的答案,但应该按照您的要求进行。使用 try
和 except
来查看该项目是否可迭代。如果为真,则递归该函数,如果为假,则将项目添加到列表中。
iterable = (((2,4),6,(9,(3,7))))
_list = []
def addToList(elem, listRef):
"""
elem: item you want to insert into the list
listRef: list you want to append stuff to
"""
try:
for x in elem:
addToList(x, listRef) # recursive call
except:
listRef.append(elem) # add the item if it's not iterable
# Main
for item in iterable:
addToList(item, _list) # iterate tuple, pass ea. element into addToList, pass the list you want to append to
print _list
Python 中的经验法则,快速失败并廉价失败 :)
警告:如果元组中有字符串,每个字符将附加到 _list
(因为字符串是可迭代的)。我没有围绕字符串进行设计,因为您没有指定是否使用它们。
我对 python 问题有些困惑。我想编写一个函数,该函数 returns 嵌套在一个元组中的所有对象的列表。
例如,我希望能够将元组 (((2,4),6,(9,(3,7))) 转换为 [2,4,6,9,3, 7]. 然而,我真的不确定如何开始,因为元组是不可变的。谢谢!
from re import findall
a = ((143,243),534,((55,356)),645)
print findall('\d+', str(a))
# ['143', '243', '534', '55', '356', '645']
b = ((1,2),5,((5,6)),345)
print findall('\d+', str(b))
# ['1', '2', '5', '5', '6', '345']
您需要将元组的元组展平,请参阅 Flattening a shallow list in Python 和 James Brady 提供的解决方案:
def flatten(x):
result = []
for el in x:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
result.extend(flatten(el))
else:
result.append(el)
return result
这是递归的一个很好的例子 - 虽然 Nicolas 已经有了类似的答案。
我们在这里设置了您提供的元组。我们还设置了一个空列表,您希望在其中包含元组。
函数从元组开始,循环遍历每个元素。如果元素是一个元组,它会再次调用该函数,递归地直到你到达一个非元组。然后将其插入列表。
tup = (((2,4),6,(9,(3,7))))
listversion = []
def loopthroughtup(tup):
for i in tup:
if type(i) == tuple:
print str(i) + " is a tuple"
loopthroughtup(i)
else:
print str(i) + " is not a tuple"
listversion.append(i)
loopthroughtup(tup)
print listversion
一个非常基本的答案,但应该按照您的要求进行。使用 try
和 except
来查看该项目是否可迭代。如果为真,则递归该函数,如果为假,则将项目添加到列表中。
iterable = (((2,4),6,(9,(3,7))))
_list = []
def addToList(elem, listRef):
"""
elem: item you want to insert into the list
listRef: list you want to append stuff to
"""
try:
for x in elem:
addToList(x, listRef) # recursive call
except:
listRef.append(elem) # add the item if it's not iterable
# Main
for item in iterable:
addToList(item, _list) # iterate tuple, pass ea. element into addToList, pass the list you want to append to
print _list
Python 中的经验法则,快速失败并廉价失败 :)
警告:如果元组中有字符串,每个字符将附加到 _list
(因为字符串是可迭代的)。我没有围绕字符串进行设计,因为您没有指定是否使用它们。