首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析命令行输入的数字

解析命令行输入的数字
EN

Stack Overflow用户
提问于 2011-01-18 16:01:52
回答 5查看 3.1K关注 0票数 10

我正在编写一个命令行应用程序,希望用户能够输入数字作为单个数字或范围。因此,例如:

代码语言:javascript
运行
复制
$ myapp -n 3,4,5,6

代码语言:javascript
运行
复制
$ myapp -n 3-6

我希望我的应用程序将它们放入Python列表中,例如,3、4、5、6,我正在使用optparse,但不知道如何从这两种类型的输入创建列表。一些示例代码会很好。

编辑

我也希望能够进入多个范围:

代码语言:javascript
运行
复制
$ myapp -n 22-27, 51-64
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-18 16:13:25

代码语言:javascript
运行
复制
import argparse

def parse_range(astr):
    result = set()
    for part in astr.split(','):
        x = part.split('-')
        result.update(range(int(x[0]), int(x[-1]) + 1))
    return sorted(result)

parser = argparse.ArgumentParser()
parser.add_argument('-n', type=parse_range)
args = parser.parse_args()
print(args.n)

收益率

代码语言:javascript
运行
复制
% script.py -n 3-6
[3, 4, 5, 6]

% script.py -n 3,6
[3, 6]

% script.py -n 22-27,51-64 
[22, 23, 24, 25, 26, 27, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64]
票数 15
EN

Stack Overflow用户

发布于 2011-01-18 16:06:42

如果将n-arg包含在字符串中,则可以:

代码语言:javascript
运行
复制
def f(s):
    if '-' in s:
        i = s.index('-')
        return range(*map(int, s.split('-')))
    return map(int, s.split(','))

下面是一些例子:

代码语言:javascript
运行
复制
In [3]: s = '1, 2, 3, 4, 5, 6'

In [4]: f(s)
Out[4]: [1, 2, 3, 4, 5, 6]

In [5]: f('3-6')
Out[5]: [3, 4, 5]

In [6]: f('3-16-3')
Out[6]: [3, 6, 9, 12, 15]
票数 3
EN

Stack Overflow用户

发布于 2011-01-18 16:19:27

您可以定义参数,并在保存输入之前使用optparse回调处理输入:

代码语言:javascript
运行
复制
from optparse import OptionParser

parser = OptionParser()

def create_range_callback(option, opt, value, parser):
    i, j = map(int, value.split('-'))
    setattr(parser.values, option.dest, range(i, j+1))

parser.add_option("-r", "--range", action="callback", 
                  callback=create_range_callback, 
                  type="string", dest='list')

(options, args) = parser.parse_args()

print options.list

现在做:

代码语言:javascript
运行
复制
python2.7 test.py -r 1-5

输出:

代码语言:javascript
运行
复制
[1, 2, 3, 4, 5]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4726168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档