将整数列表传递给python

问题描述:

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

对于e.g,(来自命令行)

python test.py --a 1 2 3 4 5 -b 1 2 

在此列表中的整数的范围可以从1-50,列表2是List1中的子集。
任何帮助/建议?是​​正确的模块?任何使用该问题的顾虑?

我曾尝试:

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) 
+0

整数列表是怎么样的? – ATOzTOA 2013-03-17 11:08:43

+0

显示您要使用的示例命令行?另外,将常见评论添加为问题的一部分。 – ATOzTOA 2013-03-17 11:11:34

+0

每个列表中的整数范围从1到50.列表2是列表1的子集。 – Swati 2013-03-17 11:11:51

您可以将它们作为字符串比转换成列表。您可以使用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'] 

实施例: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

逻辑我觉得你可以自己编写。 :)

+1

任何示例代码都可以做到这一点?我也想抛出错误,如果任何列表为空或包含数量超出范围? – Swati 2013-03-17 11:02:09

+0

请带上您想要通过的样本列表。 – 2013-03-17 11:04:44

+1

@Swati *不是一个代码写入服务。请自己尝试解决问题,然后寻求解决方案的帮助。 – 2013-03-17 11:06:38

optparseargparse工作是他们从读取命令行参数,参数通过空格分开,方式,所以如果你想要输入您通过从optparseargparse命令行interfact的整数列表 -

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

或:

> my_script.py --a 1,2,3,4,5 --b 1,2 

你SC您可以通过删除空格,或用"围绕你的说法,例如做然后需要将这些输入转换为实际列表。

使用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收集所需的列表。

如果只有参数是列表和分隔符,你可以做到这一点相对简单:

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]" 
+0

我喜欢您的方法,如何提供有关输入参数和任何有关范围验证的帮助? – Swati 2013-03-17 11:28:10

​​支持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 
+0

好决定! 如果有必要列出50个数字,而不是5个,则为true) – 2013-03-17 11:37:51

+0

为什么你使用set? – Swati 2013-03-17 12:18:02

+0

因为你要求*是*设置检查。当您检查B是否在A中时,*是否设置操作* - 检查是否设置了b - 设置a为空。对于范围,我可以使用'min(a)> = 1和max(a) 2013-03-17 12:20:46

这为我工作:

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