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