【问题标题】:Convert strings of list to list of integers inside a list将列表字符串转换为列表内的整数列表
【发布时间】:2015-06-19 01:18:59
【问题描述】:

我有一个字符串列表,这些字符串是列表。像这样:['[1,2,3]','[10,12,5]'],例如。我想得到一个列表列表,甚至那里的每个列表:

[[1,2,3],[10,12,5]]

【问题讨论】:

  • 那么你尝试的时候出了什么问题?
  • 很难解释......我只想要一个元素,但我无法用 str 而不是列表来找到他。所以,当我运行我的程序时,它正在拆分所有内容,甚至是括号。但我已经得到了帮助,所以我想我现在可以处理了,谢谢。
  • 这些数据来自哪里?
  • 数据来自文件

标签: python string list int


【解决方案1】:

通常不推荐,但您可以为每个字符串使用eval

fun = ['[1,2,3]','[10,12,5]']
listy = [eval(x) for x in fun]

输出:

[[1, 2, 3], [10, 12, 5]]

This question 提供了很好的理由来说明为什么使用 eval 可能是一个坏主意。我只是在这里作为一个选项介绍它。 eval 可能会带来很大的安全风险,因为您为用户输入提供了 Python 解释器的全部功能。此外,它违反了编程的基本原则之一,即所有可执行代码应直接映射到源代码。使用eval 评估用户输入会导致可执行代码显然不在您的源代码中。

最好使用ast.literal_eval()Padraic Cunningham's answer 说明了如何有效地使用它。

【讨论】:

    【解决方案2】:

    可以使用ast.literal_eval,一般应该避免使用eval

    l= ['[1,2,3]','[10,12,5]']
    
    from ast import literal_eval
    
    print([literal_eval(ele) for ele in l])
    [[1, 2, 3], [10, 12, 5]]
    

    或者索引、拆分和映射:

    print([list(map(int,ele[1:-1].split(","))) for ele in l])
    [[1, 2, 3], [10, 12, 5]]
    

    如果你总是有相同的格式分割是最有效的解决方案:

    In [44]: %%timeit                       
    l= ['[1,2,3]','[10,12,5]']
    l = [choice(l) for _ in range(1000)]
    [eval(ele) for ele in l]
       ....: 
    100 loops, best of 3: 8.15 ms per loop
    
    In [45]: %%timeit
    l= ['[1,2,3]','[10,12,5]']
    l = [choice(l) for _ in range(1000)]
    [literal_eval(ele) for ele in l]
       ....: 
    100 loops, best of 3: 11.4 ms per loop
    
    In [46]: %%timeit                       
    l= ['[1,2,3]','[10,12,5]']
    l = [choice(l) for _ in range(1000)]
    [list(map(int,ele[1:-1].split(","))) for ele in l]
       ....: 
    100 loops, best of 3: 2.07 ms per loop
    

    【讨论】:

      【解决方案3】:

      您应该使用literal_evalstring 获取实际的list 对象。

      >>> from ast import literal_eval
      >>> data =  ['[1,2,3]','[10,12,5]']
      >>> data = [literal_eval(each) for each in data]
      >>> data
      [[1, 2, 3], [10, 12, 5]]
      

      literal_eval 安全地评估每个对象。

      >>> help(literal_eval)
      Help on function literal_eval in module ast:
      
      literal_eval(node_or_string)
          Safely evaluate an expression node or a string containing a Python
          expression.  The string or node provided may only consist of the following
          Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
          and None.
      

      您应该始终尽量避免使用eval 函数。阅读更多here

      【讨论】:

        【解决方案4】:

        你使用ast.literal_eval

        import ast
        l =  ['[1,2,3]','[10,12,5]']
        l = [ast.literal_eval(i) for i in l]
        

        【讨论】:

          【解决方案5】:

          使用正则表达式:

          new_list = [[int(j) for j in re.findall(r'\d+', i)] for i in old_list]
          

          【讨论】:

          • 你明白了吗?基本上它会在每个字符串中搜索一个数字,并将所有这些数字字符串转换为整数。
          • 你从哪里得到 re.findall?
          • @DianaVasconcelosFerreira 你必须import re
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-08
          • 1970-01-01
          • 2021-10-29
          • 1970-01-01
          • 2022-12-18
          • 2015-01-14
          相关资源
          最近更新 更多