我有一个列表,其中包含可能代表单词(字母数字意义上的)或整数的字符串列表,例如
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])?
答案 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]]