我想通过整数作为输入的2名名单Python程序。
为例如,(来自命令行)
python test.py --a 1 2 3 4 5 -b 1 2
在此列表中的整数的范围可以从1-50,表2是列表1的子集。
任何帮助/建议? 是argparse
正确的模块? 在使用任何顾虑吗?
我试过了 :
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--a', help='Enter list 1 ')
parser.add_argument('--b', help='Enter list 2 ')
args = parser.parse_args()
print (args.a)
Answer 1:
您可以将它们作为字符串比转换成列表。 您可以使用argparse或optparse 。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--l1', type=str)
parser.add_argument('--l2', type=str)
args = parser.parse_args()
l1_list = args.l1.split(',') # ['1','2','3','4']
例如: python prog.py --l1=1,2,3,4
此外,作为一个线你可以通过像这个1-50再拆“ - ”和构建范围。 事情是这样的:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--l1', type=str, help="two numbers separated by a hyphen")
parser.add_argument('--l2', type=str)
args = parser.parse_args()
l1_list_range = xrange(*args.l1.split('-')) # xrange(1,50)
for i in l1_list_range:
print i
例如: python prog.py --l1=1-50
逻辑我觉得你可以自己编写。 :)
Answer 2:
argparse
支持nargs
参数,它告诉你有多少参数吃。 当nargs="+"
它接受一个或多个参数,所以可以传递-b 1 2 3 4
,它将被指定为一个列表b
参数
# args.py
import argparse
p = argparse.ArgumentParser()
# accept two lists of arguments
# like -a 1 2 3 4 -b 1 2 3
p.add_argument('-a', nargs="+", type=int)
p.add_argument('-b', nargs="+", type=int)
args = p.parse_args()
# check if input is valid
set_a = set(args.a)
set_b = set(args.b)
# check if "a" is in proper range.
if len(set_a - set(range(1, 51))) > 0: # can use also min(a)>=1 and max(a)<=50
raise Exception("set a not in range [1,50]")
# check if "b" is in "a"
if len(set_b - set_a) > 0:
raise Exception("set b not entirely in set a")
# you could even skip len(...) and leave just operations on sets
# ...
所以,你可以运行:
$ python arg.py -a 1 2 3 4 -b 2 20
Exception: set b not entirely in set a
$ python arg.py -a 1 2 3 4 60 -b 2
Exception: set a not in range [1,50]
这是有效的:
$ python arg.py -a 1 2 3 4 -b 2 3
Answer 3:
这为我工作:
parser.add_argument('-i', '--ids', help="A comma separated list IDs", type=lambda x: x.split(','))
编辑:
我刚刚意识到,这实际上并没有回答被问的问题。 的Jakub有正确的解决方案。
Answer 4:
该方法optparse
和argparse
工作是他们在命令行中读取参数,参数通过空格分开,所以如果你想输入你通过命令行interfact的整数列表optparse
或argparse
-您可以通过删除做到这一点的空间,或与周围你的观点"
,例如:
> my_script.py --a "1 2 3 4 5" --b "1 2"
要么:
> my_script.py --a 1,2,3,4,5 --b 1,2
然后,您的脚本需要这些输入转换成实际列表。
使用argparse
语法(非常类似optparse
):
# with spaces and "
a_lst = [i for i in args.a.split(' ')]
b_lst = [i for i in args.b.split(' ')]
# without spaces and ,
a_lst = [i for i in args.a.split(',')]
b_lst = [i for i in args.b.split(',')]
另一种方式做,这将是要么导入要运行该模块并通过列表对象,以你的代码涉及的一类,或者通过使用while循环和raw_input
/ input
,收集所需的列表。
Answer 5:
如果只参数是列表和分隔符,你可以做到这一点相对简单:
sa = sys.argv.index('-a')
sb = sys.argv.index('-b')
lista = [int(i) for i in sys.argv[sa+1:sb]]
listb = [int(i) for i in sys.argv[sb+1:]]
添加验证很简单:
aval = [i for i in lista if i>1 and i<50]
if len(aval) < len(lista):
print 'The -a list contains invalid numbers.'
bval = [i for i in listb if i>1 and i<50]
if len(bval) < len(listb):
print 'The -b list contains invalid numbers.'
产生帮助信息:
if sys.argv[1] in ['-h', '-H'] or len(sys.argv) == 1:
print "Usage: <name> -a [list of integers] -b [list of integers]"
Answer 6:
只需添加这一项的完整性。 我很惊讶,我没有看到这种方法。
from argparse import Action, ArgumentParser
class CommaSeparatedListAction(Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values.split(','))
parser = ArgumentParser()
parser.add_argument('-l', action=CommaSeparatedListAction)
print(parser.parse_args('-l a,b,c,d'.split()))
# Namespace(l=['a', 'b', 'c', 'd'])
这只是一个简单的例子,但你也可以添加验证或以某种方式改变等值作为强迫他们为大写。
from argparse import Action, ArgumentParser
class UppercaseLetterCommaSeparatedListAction(Action):
def __call__(self, parser, namespace, values, option_string=None):
letters = values.split(',')
for l in letters:
self._validate_letter(parser, l)
setattr(
namespace,
self.dest,
list(map(lambda v: v.upper(), letters))
)
def _validate_letter(self, parser, letter):
if len(letter) > 1 or not letter.isalpha():
parser.error('l must be a comma separated list of letters')
parser = ArgumentParser()
parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
print(parser.parse_args('-l a,b,c,d'.split()))
# Namespace(l=['A', 'B', 'C', 'D'])
parser = ArgumentParser()
parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
print(parser.parse_args('-l a,bb,c,d'.split()))
# usage: list.py [-h] [-l L]
# list.py: error: l must be a comma separated list of letters
parser = ArgumentParser()
parser.add_argument('-l', action=UppercaseLetterCommaSeparatedListAction)
print(parser.parse_args('-l a,1,c,d'.split()))
# usage: list.py [-h] [-l L]
# list.py: error: l must be a comma separated list of letters
文章来源: Passing integer lists to python