将整数列表传递给python

将整数列表传递给python,python,command-line,argparse,Python,Command Line,Argparse,我想将两个整数列表作为输入传递给python程序 例如,(从命令行) 此列表中的整数范围为1-50,列表2是列表1的子集。 有什么帮助/建议吗?argparse是正确的模块吗?使用它有什么问题吗 我试过: import argparse if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--a', help='Enter list 1 ') parser.a

我想将两个整数列表作为输入传递给python程序

例如,(从命令行)

此列表中的整数范围为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)

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

import argparse
parser=argparse.ArgumentParser()
parser.add_参数('--l1',type=str)
parser.add_参数('--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_参数('--l1',type=str,help=“由连字符分隔的两个数字”)
parser.add_参数('--l2',type=str)
args=parser.parse_args()
l1_list_range=xrange(*args.l1.split('-')#xrange(1,50)
对于l1_列表_范围内的i:
打印i
示例:
python prog.py--l1=1-50

逻辑我想你可以自己写。:)

他们从命令行读取参数的方式和工作方式是,参数被空格分割,因此如果您想通过命令行界面输入整数列表,可以从或-删除空格,或者用
包围参数,例如:

> my_script.py --a "1 2 3 4 5" --b "1 2"
或:

然后,脚本需要将这些输入转换为实际列表

使用语法(非常类似于):


另一种方法是导入要运行的模块并将列表对象传递给处理代码的类,或者使用while循环和/或收集所需的列表。

如果唯一的参数是列表和分隔符,则可以相对简单地执行:

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.'

aval=[i代表列表中的i,如果i>1和i1,并且i
argparse
支持参数,它会告诉您它需要多少参数。 当
nargs=“+”
接受一个或多个参数时,您可以传递
-b12 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 3
这对我很有用:

parser.add_参数('-i','-ids',help=“以逗号分隔的列表id”,type=lambda x:x.split(','))

编辑:


我刚刚意识到,这实际上并没有回答所问的问题。Jakub有正确的解决方案。

只是为了完整起见添加了这个。我很惊讶我没有看到这种方法

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

有任何示例代码可以执行此操作吗?如果任何列表为空或包含的数字超出范围,我也想抛出错误?请提供一个要通过的示例列表。@Swati StackOverflow不是一个代码编写服务。请尝试解决此问题,然后寻求解决方案方面的帮助。示例列表列表1包含数字1-50和list2包含列表1中的数字子集整数列表是什么样子的?显示一个您将要使用的命令行示例?此外,在问题中添加常见注释。每个列表中的整数范围为1到50。列表2是列表1的子集。按惯例,分隔的值是不同的参数。请引用列表(
)1 2 3 4 5“
)或逗号分隔它们(
1,2,3,4,5
)--然后
argparse
将它们视为一个参数。@Katrielex:
nargs=”+"
改变了这种行为,因此它将
-a 1 2 3
作为一个列表吃掉。我喜欢你的方法,我如何提供有关输入参数的帮助和有关范围的任何验证?好的决定!如果需要列出50个数字,则为true,而不是5,它很长),因为你要求的是集合检查。当你检查B是否在a中时,它是Is set operation-检查set b-set a是否为空。对于范围,我可以使用
min(a)>=1和max(a)进行有效性检查,为什么不使用
if all(1@InbarRose:nice one,如果我重构它,我会使用它
# 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
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