【问题标题】:How can I convert this string to list of lists? [duplicate]如何将此字符串转换为列表列表? [复制]
【发布时间】:2011-02-08 07:25:35
【问题描述】:

如果用户输入[[0,0,0], [0,0,1], [1,1,0]] 并按回车, 程序应该将此字符串转换为多个列表; 一个列表包含[0][0][0],另一个为[0][0][1],最后一个列表为[1][1][0]

python有没有好的方法来处理这个问题?

【问题讨论】:

  • 不清楚您要做什么。您是否使用raw_input() 或类似的东西将输入作为字符串?
  • 原始输入。对不起。我忘了提。
  • Personman 的回答是我在 python 级别上可以立即理解的最简单的解决方案。但是,也感谢所有其他专业 python 用户! :D 阅读各种不同的、有创意的答案非常有趣!你们太棒了!

标签: python list tuples


【解决方案1】:

[[int(i) for i in x.strip(" []").split(",")] for x in s.strip('[]').split("],")]

列表推导中的列表推导... 但这会融化你的大脑

【讨论】:

    【解决方案2】:
    >>> string='[[0,0,0], [0,0,1], [1,1,0]]'
    >>> eval(string)
    [[0, 0, 0], [0, 0, 1], [1, 1, 0]]
    >>> a=eval(string)
    >>> a
    [[0, 0, 0], [0, 0, 1], [1, 1, 0]]
    

    在将您的字符串传递给 eval() 之前,请先进行必要的清理。

    【讨论】:

    • 请不要在没有解释它如何执行完全任意的 Python 代码的情况下建议 eval()。
    • 用户只需输入“exit()”...
    【解决方案3】:
    >>> import ast
    >>> ast.literal_eval('[[0,0,0], [0,0,1], [1,1,0]]')
    [[0, 0, 0], [0, 0, 1], [1, 1, 0]]
    

    对于元组

    >>> ast.literal_eval('[(0,0,0), (0,0,1), (1,1,0)]')
    [(0, 0, 0), (0, 0, 1), (1, 1, 0)]
    

    【讨论】:

    • 8 年后仍然相关... :)
    • 9 年后,仍然像魅力一样工作。建议使用前先看看link
    • 太棒了。完美。
    • 10 年后,仍然是最佳答案 - FAR。
    【解决方案4】:

    这比 Satoru 的灵活一点,并且不使用任何库。不过,它不适用于更深的嵌套列表。为此,我认为您需要一个递归函数(或循环)或 eval。

    str = "[[0,0,0],[0,0,1],[1,1,0]]"
    strs = str.replace('[','').split('],')
    lists = [map(int, s.replace(']','').split(',')) for s in strs]
    

    lists 现在包含您想要的列表列表。

    【讨论】:

    • 谢谢!这是我在 python 级别可以立即理解的最简单的解决方案。也感谢其他 python 用户! :D
    • @Prixius,这个解决方案没有得到支持是有原因的。这很容易成为最丑陋和最不正当的解决方案。我投票支持@S.Mark 的解决方案。
    • @Marcelo Cantos,感谢您的建议。如果专业 python 用户看到它,这可能会被认为是一个糟糕的解决方案。但是,他的解决方案只适用于我的程序,并且很容易向其他人解释。 :) 最重要的是,我不知道什么是 ast 或 json 东西......并且想知道是否可以不导入东西......但是,再次感谢您的建议。如果有一天我更深入地了解python,我也会看看你的答案!
    • 这一切都很好,但你是在奖励糟糕的设计并自己采用它。这既不是生成好代码的好方法,也不是学习新语言的好方法。最好简单地听从知道他们在说什么的人的指导,然后让理解来。上蜡!脱蜡!此外,不难弄清楚:import ast; help(ast.literal_eval).
    • 我很高兴地承认我的代码很丑 - 但是没有人提出任何更好的遵循相同约束的方法。也许导入库是正确的,一般来说,如果没有一个通用的递归解决方案会更可取,但也许你真的不想做这些事情中的任何一个,因为一些晦涩但很好的理由。我的代码可能不那么折衷的一种方法是使用嵌套列表理解而不是映射......除此之外,是否有一种从根本上更好的快速而肮脏的方法来做到这一点?
    【解决方案5】:
    >>> import re    
    >>> list_strs = re.findall(r'\[\d+\,\d+\,\d+\]', s)
    >>> [[[int(i)] for i in l[1:-1].split(',')] for l in list_str]
    

    【讨论】:

      【解决方案6】:
      >>> import json
      >>> json.loads('[[0,0,0], [0,0,1], [1,1,0]]')
      [[0, 0, 0], [0, 0, 1], [1, 1, 0]]
      

      【讨论】:

      • 请注意,这会将表达式解析为 JSON,not 解析为 Python 文字。对于列表、整数和字符串,这几乎是相同的。对于其他类型,例如元组,它不起作用。
      • 这只是没有外部模块的python 2.6+
      • @Thomas Wouters 你是同一个 Thomas Wouters,谁向谷歌员工解释 Python 内部原理?
      猜你喜欢
      • 2023-01-04
      • 2019-10-21
      • 2021-11-18
      • 1970-01-01
      • 2013-02-28
      • 2015-08-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多