【问题标题】:Convert string list to list in python将字符串列表转换为python中的列表
【发布时间】:2018-04-11 03:22:28
【问题描述】:

我有一个字符串如下,

val = '["10249/54","10249/147","10249/187","10249/252","10249/336"]'

我需要解析它并取 / 之后的值并放入下面的列表中

['54','147','187','252','336']

我的代码[a[a.index('/')+1:] for a in val[1:-1].split(',')]

输出['54"', '147"', '187"', '252"', '336"']

它也有双引号 " 这是错误的。 在我尝试如下之后

c = []
for a in val[1:-1].split(','):
    tmp = a[1:-1]
    c.append(tmp[tmp.index('/')+1:])

输出:

['54', '147', '187', '252', '336']

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python string list


    【解决方案1】:

    你可以在一行中使用literal_eval

    from ast import literal_eval
    
    val = ['54','147','187','252','336']
    a = [i.split('/')[-1] for i in literal_eval(val)]
    
    print(a)
    

    输出:

    ['54', '147', '187', '252', '336']
    

    literal_eval() 将你的字符串转换成一个列表,然后i.split('/')[-1] 抓取斜线后面的内容。

    【讨论】:

      【解决方案2】:

      是的......假设每个值都有一个 / 像你的例子,这是优越的:

      >>> from ast import literal_eval
      >>>
      >>> val = '["10249/54","10249/147","10249/187","10249/252","10249/336"]'
      >>> [int(i.split('/')[1]) for i in literal_eval(val)]
      [54, 147, 187, 252, 336]
      

      *已编辑以插入忘记的括号

      【讨论】:

      • 他想要一个字符串列表:[str(i.split('/')[1]) for i in literal_eval(val)] 交换 intstr
      • 我……猜?我认为他想要整数,但他正在尝试获取字符串以便他可以map(int)。无论如何,我更喜欢这样写的答案。由 OP 选择。
      • 这有点过分回答(不需要整数转换),但是是的,接下来可能 OP 会问什么 :)
      【解决方案3】:

      尝试使用正则表达式!

      你可以这样在一行中完成。

      import re
      
      val = '["10249/54","10249/147","10249/187","10249/252","10249/336"]'
      
      output = re.findall('/(\d+)', val) # returns a list of all strings that match the pattern
      
      print(output)
      

      结果: ['54', '147', '187', '252', '336']

      re.findall 生成一个新列表,调用该列表,其中包含正则表达式的所有匹配项。查看docs on regular expressions 了解有关此主题的更多信息。

      【讨论】:

      • 它在 python 2 中的工作方式相同。提示:最好将print 的结果放在你的答案中,以便其他人可以根据需要直观地检查它是否工作。
      【解决方案4】:

      您可以尝试json模块将字符串转换为列表

      >>> import json
      >>> val ='["10249/54","10249/147","10249/187","10249/252","10249/336"]'
      >>> list(map(lambda x: x.split('/')[-1], json.loads(val)))
      >>> ['54', '147', '187', '252', '336']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-15
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        • 2016-11-09
        • 1970-01-01
        相关资源
        最近更新 更多