将整数列表传递给python

Swa*_*ati 16 python command-line argparse

我想传递2个整数列表作为python程序的输入.

例如,(来自命令行)

python test.py --a 1 2 3 4 5 -b 1 2  
Run Code Online (Sandbox Code Playgroud)

此列表中的整数范围为1-50,列表2是List1的子集.
任何帮助/建议?是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)
Run Code Online (Sandbox Code Playgroud)

Jak*_* M. 43

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
# ...
Run Code Online (Sandbox Code Playgroud)

所以你可以运行:

$ 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]
Run Code Online (Sandbox Code Playgroud)

这是有效的:

$ python arg.py  -a 1 2 3 4 -b 2 3
Run Code Online (Sandbox Code Playgroud)


Ell*_*bal 7

您可以将它们作为字符串传递而不是转换为列表.您可以使用argparseoptparse.

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']
Run Code Online (Sandbox Code Playgroud)

例: 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
Run Code Online (Sandbox Code Playgroud)

例: python prog.py --l1=1-50

逻辑我认为你可以写自己.:)

  • @Swati StackOverflow不是代码编写服务.请自己尝试解决问题,然后寻求解决方案的帮助. (3认同)

bob*_*ble 5

这为我工作:

parser.add_argument('-i', '--ids', help="A comma separated list IDs", type=lambda x: x.split(','))

编辑:

我刚刚意识到,这实际上并不能回答所提出的问题。雅库布(Jakub)有正确的解决方案。