从用户输入动态生成列表

时间:2013-05-15 12:03:28

标签: python list xrange

正如标题所说,我正在处理一些命令行选项,以便根据用户输入创建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 ”vs 。“ 3,28 ”与“ 28 ”)。 len(rR)确实告诉我输入中的元素数量,但我有点迷失在这里我如何使用该信息动态编写xrange / range部分。

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

3 个答案:

答案 0 :(得分:6)

试试这个:

>>> 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的参数。

答案 1 :(得分:2)

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]

参考文献:

答案 2 :(得分:1)

我更喜欢(list | generator)对map的理解。我认为它们通常被认为更“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]