匹配python中map()以外的列表结构

时间:2014-12-02 18:49:38

标签: python list map

我正在尝试编写一个递归函数,它将对列表中的每个对象执行一些操作,然后输出一个与处理列表的结构完全匹配的新列表。我在这里得到了一些用户的帮助,但在我的例子中,我尝试了一些碰巧可迭代的字符串,并且与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()在整数列表上失败。想象一下任何其他不可迭代的数据类型。有没有另一种方法来定义这个,让我在列表中的对象上执行一些功能,然后创建一个匹配输入列表的输出列表?

谢谢,

3 个答案:

答案 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子句,以便对项目执行简单的添加。无需maplambda

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