将整数列表传递给Python

41 投票
6 回答
52723 浏览
提问于 2025-04-17 19:23

我想把两个整数列表作为输入传给一个Python程序。

比如说,从命令行输入:

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

这个列表里的整数可以在1到50之间,第二个列表是第一个列表的子集。
有没有什么帮助或建议?使用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)

6 个回答

7

这个对我有用:

parser.add_argument('-i', '--ids', help="一个用逗号分隔的ID列表", type=lambda x: x.split(','))

编辑:

我刚刚意识到这其实没有回答提问的内容。Jakub 提供了正确的解决方案。

84

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
15

你可以把它们当作字符串传入,然后再转换成列表。你可以使用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

我觉得这个逻辑你可以自己写出来。:)

撰写回答