我正在尝试编写一个递归函数,它将对列表中的每个对象执行一些操作,然后输出一个与处理列表的结构完全匹配的新列表。我在这里得到了一些用户的帮助,但在我的例子中,我尝试了一些碰巧可迭代的字符串,并且与map()配合得很好。但是当我将它应用于其他不可迭代的数据类型时,我得到一个错误:
def process_list(_list):
new_list = []
for x in _list:
if is_list(x):
new_list.append(process_list(x))
else:
new_list.append(map(lambda y: y + 1, x))
return new_list
def is_list(l):
return type(l) == types.ListType
_list = [[0,1,2],[0,1,2],[0,1,2]],[0,1,2]]
我在这里使用Integers作为示例,因为它们不可迭代,我期望map()在整数列表上失败。想象一下任何其他不可迭代的数据类型。有没有另一种方法来定义这个,让我在列表中的对象上执行一些功能,然后创建一个匹配输入列表的输出列表?
谢谢,
答案 0 :(得分:1)
你试图在map()
上迭代(使用x
函数),这在大多数情况下是不可迭代的。您可以为字符串执行此操作的原因是因为它们本身是可迭代的对象,这就是您没有立即遇到此问题的原因。你真的不需要在for循环中使用map()
......你可以做到
for x in _list:
if is_list(x):
new_list.append(process_list(x))
else:
new_list.append(x+1)
你能做的最好的事情就是直接使用地图:
def process_list(_list):
return map( lambda x: process_list(x) if type(x)==list else x+1, _list )
答案 1 :(得分:0)
尝试修改else
子句,以便对项目执行简单的添加。无需map
或lambda
。
import types
def process_list(_list):
new_list = []
for x in _list:
if is_list(x):
new_list.append(process_list(x))
else:
new_list.append(x+1)
return new_list
def is_list(l):
return type(l) == types.ListType
_list = [[[0,1,2],[0,1,2],[0,1,2]],[0,1,2]]
print process_list(_list)
结果:
[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [1, 2, 3]]
如果您希望process_list
的呼叫看起来更像map
,则可以要求另外一个参数,该参数指示应该进行哪种处理。
import types
def process_list(func, _list):
new_list = []
for x in _list:
if is_list(x):
new_list.append(process_list(func, x))
else:
new_list.append(func(x))
return new_list
def is_list(l):
return type(l) == types.ListType
_list = [[[0,1,2],[0,1,2],[0,1,2]],[0,1,2]]
print process_list(lambda x: x+1, _list)
答案 2 :(得分:0)
检查isinstance
以查看类型是什么,并以此为基础:
def process_list(_list):
new_list = []
for x in _list:
if isinstance(x, list):
new_list.append(process_list(x))
elif isinstance(x, (int, float)):
new_list.append(x+1)
else:
new_list.append(map(lambda y: y + 1, x))
return new_list
您也可以使用collections.Iterable在检查列表后查找可迭代元素,如果您只想在字符串上调用map,那么您将使用isinstance(x, basestring)
检查所有内容取决于您尝试的内容实现:
from collections import Iterable
def process_list(_list):
new_list = []
for x in _list:
if isinstance(x, list):
new_list.append(process_list(x))
elif isinstance(x, Iterable):
new_list.append(map(lambda y: y + 1, x))
else:
new_list.append(x+1)
return new_list