我有一个结构化的列表列表,其中每个元素都是一个字符串。我想将此列表列表中的某些(已知索引,始终相同)元素转换为整数。我尝试过使用列表理解或isdigit()
方法(没有负面元素),但无法弄清楚。
list_of_lists = [['spam','1','toast'], ['bacon','5','eggs'], ['juice', '8', 'tea']]
new_breakfast_list = [[int(element) for element in row] for row in list_of_lists]
上述代码在尝试转换第一个元素时可以理解为ValueError: invalid literal for int() with base 10: 'spam'
。我想要忽略错误并继续前进到下一个元素,或者可能专门循环到list_of_lists[i][1]
这样的东西,这样我就可以得到:
print(new_breakfast_list)
[['spam', 1, 'toast'], ['bacon', 5, 'eggs'], ['juice', 8, 'tea']]
答案 0 :(得分:4)
您的列表理解几乎是正确的,您只需要在内循环中使用isdigit()
进行检查,并使用int(element)
或element
,具体取决于值isdigit
new_breakfast_list = [[int(element) for element in row if element.isdigit() else element] for row in list_of_lists]
或者,如您所知,整数元素出现在索引1
,您可以使用:
for element in list_of_lists:
element[1]=int(element[1])
如果您知道要更改的索引,则应使用此方法,因为它会不必要地循环遍历每个元素。
答案 1 :(得分:2)
因为您正在处理正整数,所以您可以检查字符串中是否只包含数字并使用三元数转换或不转换。
list_of_lists = [['spam','1','toast'], ['bacon','5','eggs'], ['juice', '8', 'tea']]
new_breakfast_list = [[int(element) if element.isdigit() else element for element in row] for row in list_of_lists]
的产率:
[['spam', 1, 'toast'], ['bacon', 5, 'eggs'], ['juice', 8, 'tea']]
但有2个缺点:
注意:处理一般正/负/以空格整数开始的方式是一种繁琐/不那么高效的方式,只有你必须使用它!否则使用try/except
的wim答案会更好
new_breakfast_list = [[int(element) if element.strip().isdigit() or (element.strip()[0]=="-" and element.strip()[1:].isdigit()) else element for element in row] for row in list_of_lists]
答案 2 :(得分:1)
只需定义自己的小助手函数,就像:
def maybe_int(val):
try:
return int(val)
except ValueError:
return val
现在你可以在任何你想要的理解中使用它。在使用str.isdigit
检查失败的某些情况下(例如字符串中的空格,负数等),它将继续有效。
如果数据的结构是可靠的,根本不用担心这些东西。只需做一个简单的list-comp:
>>> [[x, int(n), y] for x, n, y in list_of_lists]
[['spam', 1, 'toast'], ['bacon', 5, 'eggs'], ['juice', 8, 'tea']]