" python方式"解析并有条件地替换2D列表中的每个元素

时间:2015-07-08 15:26:28

标签: python arrays list

我有一个列表,其中包含可能代表单词(字母数字意义上的)或整数的字符串列表,例如

myLists = [['5','cat','23'], 
           ['33','parakeet','scalpel'], 
           ['correct','horse','battery','staple','99']]  

我想解析数组,以便将所有整数表示转换为整数。我有一个简单的函数,numParser(string)到此为止:

def numParser(s):
    try:
        return int(s)
    except ValueError:
        return s

使用我的c / java背景,我通常会遍历两个数组,更改每个值(尽管这些数组是同构的这一事实)。但我是python的新手,并认为可能有更好的方法来做到这一点,所以我四处搜索并发现了一些关于map()和list comprehension的SO帖子。列表理解似乎不太合适,因为列表并不统一,但map()似乎应该可行。为了测试,我做了

a=['cat','5','4']
a = map(numParser, a)

哪个有效。没有想到,我在嵌套循环上做了同样的事情,但没有。

for single_list in myLists:
    single_list = map(numParser, rawData)

现在,在收到一个未更改的2D数组之后,我发现迭代器正在处理对数组的引用,而不是数组本身。 是否有超级时髦的python方法来实现我将所有整数表示转换为整数的目标,或者我是否需要直接访问每个数组值来更改它,例如myLists [1] [2] = numParser(myLists [1] [2])?

4 个答案:

答案 0 :(得分:3)

您可以使用列表理解来执行此操作:

>>> [map(numParser, li) for li in myLists]
[[5, 'cat', 23], [33, 'parakeet', 'scalpel'], ['correct', 'horse', 'battery', 'staple', 99]]

答案 1 :(得分:2)

您可以使用嵌套列表解析并使用str.isdigit()方法检查字符串是否为数字,然后将其转换为int

>>> [[int(i) if i.isdigit() else i for i in j] for j in myLists]
[[5, 'cat', 23], [33, 'parakeet', 'scalpel'], ['correct', 'horse', 'battery', 'staple', 99]]

或者如果您想使用您的功能,您可以将其传递给map功能或用于列表理解。

答案 2 :(得分:2)

这是一种方法:

for single_list in myLists:
    for i, item in enumerate(single_list):
        single_list[i] = numParser(item)

此方法的优点是您实际上替换现有列表中的元素,而不是创建新列表。

答案 3 :(得分:0)

def numParser(string):
    try:
        return int(string)
    except ValueError:
        return string

if __name__ == '__main__':
    myLists = [['5','cat','23'],
           ['33','parakeet','scalpel'],
           ['correct','horse','battery','staple','99']]

    print list(map(numParser, _list) for _list in myLists)


[[5, 'cat', 23], [33, 'parakeet', 'scalpel'], ['correct', 'horse', 'battery', 'staple', 99]]