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



我有一个列表,它由更多的字符串列表组成,这些字符串可以表示单词(在字母数字意义上)或整数,例如

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()和列表理解的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])?

您可以使用列表推导式:

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

有一种方法:

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

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

您可以使用嵌套列表推导并使用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函数或在列表推导中使用

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]]