将字符串列表转换为整数列表

Convert list of strings into list of integers

提问人:Francisco 提问时间:6/3/2022 更新时间:6/3/2022 访问量:94

问:

我需要将 2 个项目的字符串(用逗号分隔)转换为整数。

从:

[['(0,3)', '(1,2)', '(2,2)'], ['(0,3)', '(1,2)', '(2,2)']]

自:

[[(0,3), (1,2), (2,2)], [(0,3), (1,2), (2,2)]]
python 列表

评论

0赞 Haroldo_OK 6/3/2022
它看起来很简单,您可以使用正则表达式来拆分内部字符串: docs.python.org/3/library/re.html ;您可以在几个列表推导式中使用此类表达式来处理整个列表。您也可以手动拆分字符串,但它的可读性不如 re。
2赞 Daweo 6/3/2022
到目前为止,你尝试了什么?

答:

1赞 codester_09 6/3/2022 #1

如果您始终在模式中输入。

lst = [['(0,3)', '(1,2)', '(2,2)'], ['(0,3)', '(1,2)', '(2,2)']]

new_lst = list(map(lambda i:[eval(a,{}) for a in i],lst))
# OR

# new_lst = list(map(lambda i:list(map(lambda a:eval(a,{}),i)),lst))
print(new_lst)

输出

[[(0, 3), (1, 2), (2, 2)], [(0, 3), (1, 2), (2, 2)]]
lst = [['(0,3)', '(1,2)', '(2,2)'], ['(0,3)', '(1,2)', '(2,2)']]
new_lst = []
for a in lst:
    l = []
    for i in a:
        i = i[1:-1].split(',')
        t = []
        for num in i:
            t.append(int(num))
        l.append(tuple(t))

    new_lst.append(l)

print(new_lst)

输出

[[(0, 3), (1, 2), (2, 2)], [(0, 3), (1, 2), (2, 2)]]

或使用地图功能

lst = [['(0,3)', '(1,2)', '(2,2)'], ['(0,3)', '(1,2)', '(2,2)']]

new_lst = [list(map(lambda e:tuple(map(lambda a:int(a),e[1:-1].split(','))),i)) for i in lst]
print(new_lst)
[[(0, 3), (1, 2), (2, 2)], [(0, 3), (1, 2), (2, 2)]]
7赞 Andrej Kesely 6/3/2022 #2

您可以使用ast.literal_eval执行任务:

from ast import literal_eval

lst = [["(0,3)", "(1,2)", "(2,2)"], ["(0,3)", "(1,2)", "(2,2)"]]

lst = [[literal_eval(v) for v in l] for l in lst]
print(lst)

指纹:

[[(0, 3), (1, 2), (2, 2)], [(0, 3), (1, 2), (2, 2)]]

编辑:另一种方法(感谢@S3DEV):

out = [list(map(literal_eval, sub_list)) for sub_list in lst]

快速基准测试:

from timeit import timeit
from ast import literal_eval

lst = [["(0,3)", "(1,2)", "(2,2)"], ["(0,3)", "(1,2)", "(2,2)"]]


def fn1():
    return [[literal_eval(v) for v in l] for l in lst]


def fn2():
    return [list(map(literal_eval, sub_list)) for sub_list in lst]


assert fn1() == fn2()

t1 = timeit(lambda: fn1(), number=1_000)
t2 = timeit(lambda: fn2(), number=1_000)

print(t1)
print(t2)

在我的机器上打印(AMD 3700X、Python 3.9.7):

0.040873110003303736                                                                                                                                                                                           
0.04002662200946361                                                                                                                                                                                            

评论

1赞 S3DEV 6/3/2022
我只是自己测试一下。 可以用于每个子列表,这可能比双迭代执行得更快(?)。(GMTA赞成票)。:-)list(map(literal_eval, sub_list))
1赞 Andrej Kesely 6/3/2022
@S3DEV 我已将您的解决方案添加到我的答案 + 快速基准测试中(大致相同)。
1赞 codester_09 6/3/2022
@AndrejKesely对于大数据来说,第二个可以击败第一个😉。
1赞 Andrej Kesely 6/3/2022
@SharimIqbal我已经试过了.结果仍然是 ~same (3.86 对 3.85)lst = [["(0,3)", "(1,2)", "(2,2)"] * 100, ["(0,3)", "(1,2)", "(2,2)"] * 100]
1赞 Kelly Bundy 6/3/2022
试试,那你得到什么时间?literal_eval = str