【问题标题】:Convert and merge strings into a list in Python在 Python 中将字符串转换并合并为列表
【发布时间】:2009-12-08 18:17:58
【问题描述】:

在 Python 中,我有四个包含列表格式的字符串:

line1 ="['a.b.c','b.c.a','c.d.e']"
line2 ="['def','efg']"
line3 ="['f']"
line4 ="['g']"

如何将它们全部合并,以便获得有效的 Python 列表,例如:

SumLine = ['a.b.c','b.c.a','c.d.e','def','efg','f','g']

【问题讨论】:

    标签: python string list


    【解决方案1】:
    import ast
    
    line1 ="['a.b.c','b.c.a','c.d.e']"
    line2 ="['def','efg']"
    line3 ="['f']"
    line4 ="['g']"
    
    SumLine = []
    
    for x in (line1, line2, line3, line4):
      SumLine.extend(ast.literal_eval(x))
    
    print SumLine
    

    不要使用内置的eval,除非您对正在评估的字符串有超自然的信任; ast.literal_eval 虽然仅限于简单的常量,但完全安全,因此通常更可取。

    【讨论】:

    • 请注意,ast 模块仅在 Python 2.6 及更高版本中可用。
    • @Zach,是的,2.5 有 _ast,但这是较低级别,因此更难使用。
    【解决方案2】:

    简单的方法是将字符串连接到一个表达式,该表达式可以被评估以给出所需的结果:

    line1 ="['a.b.c','b.c.a','c.d.e']"
    line2 ="['def','efg']"
    line3 ="['f']"
    line4 ="['g']"
    lines = [line1, line2, line3, line4]
    
    print eval('+'.join(lines))
    

    但是,如果你不能信任你的输入,这是不安全的,所以如果你使用 Python 2.6 或更高版本,你应该在 ast 模块中使用安全 eval 函数 ast.literal_eval,尽管这不适用于 ' +' 技巧,因此您将不得不迭代每个元素。

    【讨论】:

    • @Zach,是的,这给了ValueError: malformed string。如果人们在接受答案之前尽可能少地尝试答案不是很好吗?-)
    • 我猜他选择了普通的“eval”版本。我删除了 literal_eval 的错误代码。
    【解决方案3】:

    试试eval:

    >>> line1 ="['a.b.c','b.c.a','c.d.e']"
    >>> line2 ="['def','efg']"
    >>> line3 ="['f']"
    >>> line4 ="['g']"
    >>> eval(line1) + eval(line2) + eval(line3) + eval(line4)
    ['a.b.c', 'b.c.a', 'c.d.e', 'def', 'efg', 'f', 'g']
    

    但要小心,因为eval 可能很危险。请勿在您从用户那里收到且尚未验证的输入中使用它。

    【讨论】:

      【解决方案4】:

      快速而肮脏的方法是使用eval

      SumLine = eval(line1) + eval(line2) + eval(line3) + eval(line4)
      

      但如果您从其他人那里获取这些字符串(即用户输入),请不要这样做

      【讨论】:

        【解决方案5】:

        你从哪里得到这些字符串?任何缺少真正解析器的东西都是脆弱的。如果我之前没有看过 Alex Martelli 的精彩回答,我会推荐以下内容!

        您可以将它们解析为 JSON 数组,但 JSON 想要读取双引号字符串,而不是单引号。这给方法带来了脆弱性,但仍然比不安全的eval() 更可取。

        import json
        line1 ="['a.b.c','b.c.a','c.d.e']"
        json.loads(line1.replace("'", '"'))
        

        结果是一个像[u'a.b.c', u'b.c.a', u'c.d.e']这样的解析列表,你可以继续加入解析列表。

        【讨论】:

        • 我希望您在这些字符串中间没有任何转义的单引号,否则您也会影响内容...错误!
        【解决方案6】:

        您需要先eval 他们,然后才能对结果求和。但我想知道你是如何获得这些字符串的?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-18
          • 2020-01-28
          • 1970-01-01
          • 2013-07-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多