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

3

我需要把由逗号分隔的两个字符串转换成整数。

源代码:

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

致:

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

看起来很简单,你可以使用正则表达式来拆分内部字符串:https://docs.python.org/3/library/re.html;你可以在几个列表推导式中使用这样的表达式来处理整个列表。你也可以手动拆分字符串,但这比re的方式不够可读。 - Haroldo_OK
2
你目前尝试了什么? - Daweo
2个回答

7

您可以使用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 我已将你的解决方案添加到我的答案中,并进行了快速基准测试(结果大致相同)。 - Andrej Kesely
1
对于大数据,第二个可以胜过第一个。 - codester_09
1
@SharimIqbal 我已经尝试过 lst = [["(0,3)", "(1,2)", "(2,2)"] * 100, ["(0,3)", "(1,2)", "(2,2)"] * 100]。结果仍然差不多(3.86 vs 3.85)。 - Andrej Kesely
1
尝试使用 literal_eval = str,你会得到什么结果? - Kelly Bundy
1
哈,实际上那不是我的重点。我的重点是要展示literal_eval占用了大约97%的时间,所以优化剩下的3%并不能帮助太多。 - Kelly Bundy
显示剩余3条评论

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

或者使用Map函数

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接