【问题标题】:How to convert input list into an integer list?如何将输入列表转换为整数列表?
【发布时间】:2018-08-15 05:33:36
【问题描述】:

我正在解决一个问题,用户将以这种模式给出输入-

[5,10,15,20]

由于这是用户给出的输入,因此它是一个字符串。我想将这些数字转换为整数并将它们存储在一个列表中。

我尝试使用以下代码 -

import re
mystr=input()
mylist=list(re.split('[ |, |] ',mystr))
print(mylist)

输出是:

['[5,10,15,20]']

为什么 re.split() 不能正确拆分输入? 我希望输出是用户输入的整数列表。

如果问题重复,我深表歉意。我是 python 和 stackoverflow 的新手。

非常感谢。

【问题讨论】:

  • [int(x) for x in re.split(",",mystr[1:-1])] 也会这样做。

标签: python-3.x list delimiter


【解决方案1】:

将字符串转换成对应的python:

>>> import ast
>>> mystr = '[5,10,15,20]'
>>> x = ast.literal_eval(mystr)
>>> x
[5, 10, 15, 20]

evalast.literal_eval 更通用。但是,ast.literal_eval 使用起来更安全。

文档

来自python online docs

ast.literal_eval(node_or_string)
安全地评估表达式节点或 一个包含 Python 文字或容器显示的字符串。字符串 或提供的节点只能由以下 Python 文字组成 结构:字符串、字节、数字、元组、列表、字典、集合、 布尔值和无。

这可用于安全地评估包含 Python 的字符串 来自不受信任来源的值,无需解析这些值 自己。它无法评估任意复杂的 表达式,例如涉及运算符或索引。

3.2 版更改:现在允许字节和设置文字。

使用 re

让我们稍微修改一下正则表达式:

>>> mystr = '[5,10,15,20]'
>>> list(re.split('[ |, |]+', mystr))
['[5', '10', '15', '20]']

去掉前后方括号:

>>> list(re.split('[ |, |]+', mystr.strip('[]')))
['5', '10', '15', '20']

上面给了我们一个字符串列表。要将它们转换为整数:

>>> [int(x) for x in re.split('[ |, |]+', mystr.strip('[]'))]
[5, 10, 15, 20]

【讨论】:

  • 感谢您的解决方案。但是为什么 re.split() 在我的代码中不起作用?我哪里错了?
  • 以何种方式更安全?如果我们使用 eval 有什么风险?
  • @AyushGoyal eval 将运行任意代码。这意味着它可能会删除或覆盖您系统上的文件等。
  • @AyushGoyal 我刚刚添加到与re 一起使用的答案代码(不太通用)以获得相同的答案。
  • 干得好,literal_eval 对我来说是新的,谢谢@John1024
【解决方案2】:

如果您足够信任用户(仅当他/她是您自己), 你可以使用,但要小心:

mylist = eval("[5,10,15,20]")

更安全的解决方案(无错误处理):

mystr = mystr.strip('[')
mystr = mystr.strip(']')
mylist = [int(i) for i in mystr.split(',')]

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多