2013-03-17 20 views
13

Bir python programına giriş olarak 2 tam sayı listesini geçmek istiyorum. (Komut satırından) örn içinTamsayı listelerini python'a geçirme

,

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

1-50 arasında olabilir bu listede tamsayılar, Liste 2 List1 bir alt kümesidir.
Her türlü yardım/öneri? argparse doğru modül mü? Bunu kullanırken herhangi bir endişeniz var mı?

denedim:

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

Tam sayı listesi nasıl görünüyor? – ATOzTOA

+0

Kullanacağınız örnek bir komut satırı gösterilsin mi? Ayrıca, sorunun bir parçası olarak ortak yorumlar ekleyin. Her listedeki – ATOzTOA

+0

tamsayılar, 1 ile 50 arasındadır. Liste 2, liste1'in alt kümesidir. – Swati

cevap

8

Sen listelerine dönüştürmek daha bunları dize olarak geçebilir. argparse veya optparse'u kullanabilirsiniz.

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

Örnek: python prog.py --l1=1,2,3,4 Ayrıca

, bir çizgi olarak bu 1-50 gibi bir şey geçebilir ve sonra bölmek '-' ve aralığı oluştururlar. Böyle şey:

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 

Örnek: python prog.py --l1=1-50

Mantık Kendini yazabilirsiniz düşünüyorum. :)

+1

Bunu yapmak için herhangi bir örnek kod var mı? Ayrıca herhangi bir liste boşsa veya aralık dışı sayıyı içeriyorsa hata atmak istiyorum. – Swati

+0

Lütfen geçmek istediğiniz örnek bir liste getirin. –

+1

@Swati StackOverflow bir kod yazma hizmeti değildir. Lütfen problem için kendinize bir girişimde bulunun ve ardından çözümünüzle ilgili yardım isteyin. –

1

optparse ve argparse eser onlar komut satırından argümanlar, tartışmalar, beyaz boşluk ile bölünür okumak olduğunu yolu böylece girişine optparse veya argparse gelen komut satırı interfact yoluyla tamsayılar listenizi istiyorsanız -

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

ya:

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

sizin sc sen ya örnek, " ile argüman çevreleyen tarafından boşlukları kaldırarak bunu yapabilirsiniz ript sonra bu girdileri gerçek bir listeye dönüştürmek zorundadır. (optparse için çok benzer) argparse sözdizimi kullanılarak

: Ya çalıştırmak istediğiniz modülü ithal ve listeyi geçirerek olacağını

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

Bunu yapmanın bir başka yolu olduğunu fırsatlar bir sınıfa nesneleri kodunuzu kullanarak veya bir süre döngü ve raw_input/input kullanarak istediğiniz listeyi toplayın.sadece argümanlar listeleri ve ayırıcıları ise

1

, nispeten basit bir şekilde yapabilirsiniz:

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

ekleme doğrulama kolaydır:

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

bir yardım mesajı üreten:

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

numaralı alt kümeyi içerir Ben yaklaşımınızı beğenirim, giriş parametreleri ve aralıklarla ilgili herhangi bir doğrulama hakkında nasıl yardım sağlayabilirim? – Swati

28

argparse destekler nargs parametresi, kaç parametrenin yer aldığını size söyler.

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

Ve bu geçerlidir: Eğer -b 1 2 3 4 geçebilir ve onu Yani çalıştırabilirsiniz b argüman

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

bir liste olarak atanacak nedenle, bir veya daha fazla parametre kabul eder nargs="+" :

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

iyi karar! Eğer 50 sayı listeleniyorsa doğrudur, 5 değil, uzun)) –

+0

Neden ayarlandı? – Swati

+0

Çünkü ne için soruyorsunuz * kontrol ediliyor. B'nin A içinde olup olmadığını kontrol ettiğinizde, * bu işlem ayarlanır * - set b - set'in boş olup olmadığını kontrol edin. Aralıklar için tutarlı olmak istedim ancak “min (a)> = 1 ve max (a) <= 50” yi kullanabilirdim. "Liste 2, Liste1'in alt kümesidir" hakkında sordunuz, hayır? –

3

Bu benim için çalıştı:

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