2013-03-17 9 views
13

整数のリストを2つ、pythonプログラムへの入力として渡したいと思っています。このリスト内の整数で1〜50の範囲であることができる整数リストをPythonに渡す

例えば、(コマンドラインから)

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

については、リスト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

+0

使用するサンプルコマンドラインを表示しますか?また、共通のコメントを質問の一部として追加します。 – ATOzTOA

+0

各リストの整数は1〜50です。リスト2はリスト1のサブセットです。 – 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

ロジック私はあなたが自分で書くことができると思います。あなたがoptparseまたはargparseからのコマンドラインinterfactまでの整数の入力リストにしたいので、もしoptparseargparse仕事は、彼らが、コマンドラインから引数を読んでいること:)

+1

これを行うためのサンプルコードはありますか?リストが空であるか範囲外の数字が含まれている場合は、エラーをスローしたいですか? – Swati

+0

渡したいサンプルリストを持って来てください。 –

+1

@Swati StackOverflowはコード作成サービスではありません。この問題で自分で試してみて、あなたの解決策について助けを求めてください。 –

1

方法は、引数は、空白によって分割されています -

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

か::

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

あなたの皮下あなたは、またはたとえば、"であなたの引数を囲むことによって、スペースを削除することによってこれを行うことができますこれらの入力を実際のリストに変換する必要があります。これを行うための別の方法は、いずれかの実行したいモジュールをインポートして、その取引のクラスにリストオブジェクトを渡すことによってでしょう

# 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(',')] 

:(optparseのために非常に似ています)argparse構文を使用して

あなたのコードで、または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

​​nargsパラメータは、それがいくつのパラメータを食べるかを示します。

$ 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 
# ... 

にリストとして割り当てられますので、それは、1つ以上のパラメータを受け入れ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'を使うことができた。あなたは「リスト2はリスト1のサブセットです」と尋ねました。 –

3

これが私の仕事:

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

関連する問題