【问题标题】:Is it possible to format text input so Python recognises it as a list?是否可以格式化文本输入以便 Python 将其识别为列表?
【发布时间】:2013-11-27 23:03:10
【问题描述】:

我有一个控制台应用程序,它提示用户输入各种输入。工作正常。

现在我想在调用的函数中添加一些额外的参数,以允许用户过滤结果。特别是,我希望用户能够输入日期范围,以返回在该时间段内创建的所有记录。

我可以向函数添加两个单独的参数,例如lowerDateLimit 和upperDateLimit。但在我看来,将一对值作为一个元组接受更简洁:dateLimits,其形式为:(lowerDateLimit, upperDateLimit)。

用户在控制台中输入文本有什么方法可以格式化他们的输入,以便 Python 将其识别为列表或元组?

或者更 Pythonic 的做法是只使用两个单独的参数作为日期的下限和上限?

【问题讨论】:

  • 如果您使用的是input,请确保他们只需要输入逗号分隔值...如果您使用的是raw_input,您将始终得到一个字符串...
  • 您想要什么样的日期格式? (2013, 6, 7) 会起作用,还是您需要解析较少的数字格式,例如“2013 年 2 月 13 日”?
  • 只是一个提示:一个通用的解析库(例如ast.literal_eval)可能会工作,但可能太笨重而不能成为一个好的实用选择。我建议选择输入格式并构建解析器,就像 @inspectorG4dget 所做的那样。
  • @DSM:我希望将多种格式的日期解析为文本。例如“2013 年 2 月 13 日”、“2013 年 2 月 13 日”、“2013 年 2 月 13 日”、“2013-02-13”。
  • @DSM:看起来dateutil 非常适合解析多种日期格式,如果我不知道将使用哪种格式。

标签: python list python-2.7 input user-input


【解决方案1】:
>>> ast.literal_eval(raw_input('Foo: '))
Foo: 1,2,3
(1, 2, 3)

【讨论】:

  • ast.literal_eval() 和 eval() 有什么区别? ast.literal_eval() 只是 eval() 的更安全版本吗?
  • @SimonTewsi:不仅如此,它允许输入看起来像 Python 文字。
  • 玩了一会儿后,我决定用这个作为解决方案。对于计划使用 ast.literal_eval(raw_input()) 的其他人的一个警告:我发现如果我作为用户尝试输入直接文本,而不是逗号分隔的列表,我必须在使用时将文本括在引号中ast.literal_eval。所以我添加了一个分支:对于预期为列表的用户输入,请使用 ast.literal_eval(raw_input()),否​​则只需使用 raw_input(),这样用户就不需要将他们的条目括在引号中。
  • 除了我对我选择做什么的评论之外,我还使用 dateutil 库来解析用户输入到 datetime 对象的列表中的日期文本。
【解决方案2】:
In [84]: nums = [int(i) for i in raw_input("Enter space separated integers: ").split()]
Enter space separated integers: 1 5 6 7 3 56  2 3 4 2 1

In [85]: nums
Out[85]: [1, 5, 6, 7, 3, 56, 2, 3, 4, 2, 1]

【讨论】:

    【解决方案3】:

    我还不能发表评论,但如果您需要一个列表而不是元组,ast.literal_eval 可以通过包含括号来处理:

    In [1]: import ast
    
    In [2]: ast.literal_eval('[1,2,3]')
    Out[2]: [1, 2, 3]
    

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      相关资源
      最近更新 更多