【问题标题】:Generationg a list from user-input dynamically从用户输入动态生成列表
【发布时间】:2013-05-09 23:50:19
【问题描述】:

正如标题所说,我正在处理一些命令行选项以根据用户输入创建list,如下所示:"3,28,2"。这是我到目前为止得到的:

>>> rR = "3,28,2"
>>> rR = re.split(r"[\W]+", rR)
>>> map(int, xrange( int(rR[0]),int(rR[1]),int(rR[2]) ))
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
>>>

仅供参考,re.split() 是因为允许用户同时使用逗号 (,) 或空格或两者作为分隔符。

我的问题是如何“自动化”xrange(object) 位,以便用户输入可以有或没有起始值和步长值(即“3,28,2”与“ 3,28" 与 "28")。 len(rR) 确实告诉我输入中的元素数量,但我有点迷失了如何使用该信息动态编写 xrange/range 部分。

有什么想法吗?还试图使我的代码尽可能高效。因此,对此的任何建议将不胜感激。干杯!!

【问题讨论】:

  • 我不明白你为什么将int 申请到xrange。独立于你的问题,你为什么不写range(int(rR[0]),int(rR[1]),int(rR[2]))?
  • @GuillaumeLemaître 我也不明白,xrange 在您需要将其全部转换为列表时没有用
  • 我猜他用xrange 做别的事,但用map(int 在这里显示结果,虽然list() 会更清楚
  • @GuillaumeLemaître:列表中有数百万个数字,我不想将整个列表加载到内存中,因此使用 xrange。这只是原始脚本的剪切粘贴,向你们展示我所追求的。但指出。谢谢!

标签: python list xrange


【解决方案1】:

试试这个:

>>> rR = "3,28,2"
>>> rR = re.split(r"[\W]+", rR)
>>> map(int, xrange(*map(int, rR)))
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
>>>

* 会将元素解包为 xrange 的参数。

【讨论】:

  • @GP89: 不知道* 把戏;从来没有想过会这么容易。多谢。只有一个问题是:map() 中缺少一个尾随 )。干杯!!
  • @MacUsers 所以我做到了!为了完整起见,我现在对其进行了编辑:)
【解决方案2】:

比起map,我更喜欢 (list|generator) 理解。我认为它们通常被认为更“pythonic”。

>>> rR = "3,28,2"
>>> range(*(int(x) for x in re.split(r"[\W]+", rR)))
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]

【讨论】:

  • 一般来说,但我认为这是map看起来更好的情况
【解决方案3】:
In [46]: import re

In [47]: rR = "3,28,2"

In [48]: range(*map(int, re.split(r"\W+", rR)))
Out[48]: [3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]

参考资料:

【讨论】:

  • 非常好!在适用的地方更改我的原始脚本。干杯!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
相关资源
最近更新 更多