2013-03-17 12 views
13

Ich möchte 2 Listen mit ganzen Zahlen als Eingabe für ein Python-Programm übergeben.Integer-Listen an Python übergeben

Für z.B. (von der Kommandozeile)

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

Die ganzen Zahlen in dieser Liste kann 1-50 reichen, Liste 2 ist Teilmenge von List1.
Irgendwelche Hilfe/Vorschläge? Ist argparse das richtige Modul? Irgendwelche Bedenken bei der Verwendung?

Ich habe versucht:

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

Wie sieht die Liste der Ganzzahlen aus? – ATOzTOA

+0

Zeigen Sie eine Befehlszeile an, die Sie verwenden werden? Fügen Sie auch allgemeine Kommentare als Teil der Frage hinzu. – ATOzTOA

+0

Ganzzahlen in den einzelnen Liste Bereich von 1 bis 50. Liste 2 ist Teilmenge von list1 – Swati

Antwort

8

Sie können sie als Zeichenfolgen übergeben als in Listen zu konvertieren. Sie können argparse oder optparse verwenden.

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

Beispiel: python prog.py --l1=1,2,3,4

Auch als Linie können Sie so etwas wie diese 1-50 passieren und dann aufgeteilt auf ‚-‘ und Reichweite aufzubauen. Etwas wie folgt aus:

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 

Beispiel: python prog.py --l1=1-50

Logic Ich glaube, Sie selbst schreiben kann. :)

+1

Jeder Beispielcode, um das zu tun? Ich möchte auch Fehler ausgeben, wenn eine Liste leer ist oder die Nummer außerhalb des Bereichs enthält? – Swati

+0

Bitte bringen Sie eine Musterliste mit, die Sie weitergeben möchten. –

+1

@Swati StackOverflow ist kein Code-Schreibdienst. Bitte versuchen Sie selbst das Problem zu lösen und bitten Sie dann um Hilfe bei Ihrer Lösung. –

1

Die Art und Weise, dass optparse und argparse Arbeit ist sie lesen Argumente aus der Kommandozeile, werden die Argumente geteilt durch white-space, also, wenn Sie eingeben möchten Ihre Liste von ganzen Zahlen über die Befehlszeile aus interfact optparse oder argparse - Sie können dies durch die Räume zu entfernen, oder durch Ihr Argument mit " umgibt, Beispiel:

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

oder:

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

Ihr sc ript muss diese Eingaben dann in eine tatsächliche Liste konvertieren.

Mit argparse Syntax (sehr ähnlich für 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(',')] 

Ein anderer Weg, dies zu tun, indem sie entweder den Import des Moduls sein würden Sie die Liste laufen und vorbei wollen Objekte in einer Klasse, die Angebote mit Ihrem Code oder mit einer while-Schleife und raw_input/input, um die gewünschte Liste zu sammeln.

1

Wenn die nur Argumente die Listen und die Separatoren sind, können Sie es tun, relativ einfach:

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

Validierung ist ganz einfach:

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

eine Hilfemeldung Producing:

if sys.argv[1] in ['-h', '-H'] or len(sys.argv) == 1: 
    print "Usage: <name> -a [list of integers] -b [list of integers]" 
+0

Ich mag Ihren Ansatz, wie kann ich Hilfe in Bezug auf die Eingabeparameter und jede Validierung über den Bereich bieten? – Swati

28

argparse unterstützt nargs Parameter, der Ihnen sagt, wie viele Parameter es isst. Wenn nargs="+" es einen oder mehrere Parameter akzeptiert, so dass Sie -b 1 2 3 4 und es wird zugewiesen als Liste b Argument

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

So können Sie laufen passieren kann:

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

Und das gilt:

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

gute entscheidung! wahr, wenn es notwendig ist, die 50 Nummern aufzulisten, nicht 5, ist es lang)) –

+0

Warum hast du Set? – Swati

+0

Weil, was du verlangst * wird * gesetzt, überprüfend. Wenn Sie überprüfen, ob B in A ist, * ist die Operation * eingestellt - prüfen Sie, ob die Einstellung b - set a leer ist. Für Bereiche könnte ich 'min (a)> = 1 und max (a) <= 50' verwenden, obwohl ich konsistent sein wollte. Sie haben nach "Liste 2 ist Teilmenge von Liste1" gefragt. Nein? –

3

Dieser arbeitete für mich:

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

Verwandte Themen