2013-03-17 2 views
13

파이썬 프로그램에 입력으로 2 개의 정수리스트를 전달하고자합니다. (명령 행) 예컨대 용파이썬에 정수리스트 전달하기

,

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

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

정수 목록은 어떻게 생겼습니까? – ATOzTOA

+0

사용할 샘플 명령 줄을 표시 하시겠습니까? 또한 일반적인 질문을 질문의 일부로 추가하십시오. – ATOzTOA

+0

각 목록의 정수는 1-50 범위입니다. 목록 2는 list1의 하위 집합입니다. – Swati

답변

8

당신은 목록에 변환 이상의 문자열로 전달할 수 있습니다. 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

논리 당신이 직접 작성 수 있다고 생각합니다. :)

+1

어떤 샘플 코드라도 가능합니까? 목록이 비어 있거나 범위를 벗어난 숫자가 포함되어 있으면 오류가 발생하기를 원합니다. – Swati

+0

전달하고자하는 샘플 목록을 가져 오십시오. –

+1

@Swati StackOverflow는 코드 작성 서비스가 아닙니다. 문제를 직접 해결 한 다음 솔루션에 대한 도움을 요청하십시오. –

1

optparseargparse 작업들이 명령 줄에서 인수, 인수, 공백에 의해 분할 읽을되는 방법 그래서 당신이 입력 optparse 또는 argparse에서 명령 줄 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 당신은, 또는 예를 들어, "으로 인수를 둘러싼하여 공간을 제거하여이 작업을 수행 할 수 있습니다 ript는이 입력을 실제 목록으로 변환해야합니다. (optparse 매우 유사) argparse 구문을 사용하여

: 하나가 실행하려는 모듈을 수입하고 목록을 전달하여 것

# 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을 사용하여 원하는 목록을 수집하십시오. 인수 목록과 구분이 경우

1

, 당신은 비교적 간단하게 수행 할 수 있습니다

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

28

argparsenargs 매개 변수는 먹는 매개 변수의 수를 알려줍니다.

$ 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] 

을 그리고이 유효합니다 : 당신이 -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 
# ... 

에 목록으로 할당 할 수 있도록이 하나 개 이상의 매개 변수를 허용 nargs="+" :

$ python arg.py -a 1 2 3 4 -b 2 3 
+0

좋은 결정! 5가 아니라 50 개의 숫자를 나열해야하는 경우 true) –

+0

왜 유 세트가 사용 되었습니까? – Swati

+0

* 당신이 물어 보는 것은 * 설정 확인입니다. B가 A에 있는지 점검 할 때 * 작동합니다. * - 설정된 경우 b - 세트 a가 비 었는지 확인하십시오. 범위의 경우 일관성을 유지하기 위해 min (a)> = 1 및 max (a) <= 50'을 사용할 수 있습니다. List2는 List1의 하위 집합입니다. " –

3

이 나를 위해 일한 :

,536,

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