2013-03-17 76 views
13

Tôi muốn chuyển 2 danh sách số nguyên làm đầu vào cho chương trình python.Truyền danh sách số nguyên vào python

Đối với ví dụ, (từ dòng lệnh)

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

Các số nguyên trong danh sách này có thể dao động 1-50, Danh sách 2 là tập hợp con của List1.
Bất kỳ trợ giúp/đề xuất nào? Có phải argparse mô-đun phù hợp không? Bất kỳ mối quan tâm trong việc sử dụng đó?

Tôi đã thử:

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

Danh sách các số nguyên trông như thế nào? – ATOzTOA

+0

Hiển thị dòng lệnh mẫu bạn sẽ sử dụng? Ngoài ra, hãy thêm nhận xét chung làm một phần của câu hỏi. – ATOzTOA

+0

số nguyên trong mỗi phạm vi danh sách từ 1 đến 50. Danh sách 2 là tập hợp con của danh sách1 – Swati

Trả lời

8

Bạn có thể vượt qua chúng như dây đàn vì chuyển sang danh sách. Bạn có thể sử dụng argparse hoặc 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'] 

Ví dụ: python prog.py --l1=1,2,3,4

Ngoài ra, như một dòng bạn có thể vượt qua một cái gì đó giống như 1-50 này và sau đó chia vào '-' và xây dựng nhiều. Something như thế này:

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 

Ví dụ: python prog.py --l1=1-50

logic Tôi nghĩ rằng bạn có thể viết cho mình. :)

+1

Bất kỳ mã mẫu nào để làm điều đó? Tôi cũng muốn ném lỗi nếu bất kỳ danh sách nào trống hoặc chứa số nằm ngoài phạm vi? – Swati

+0

Vui lòng mang theo một danh sách mẫu mà bạn muốn chuyển. –

+1

@Swati StackOverflow không phải là dịch vụ viết mã. Vui lòng cố gắng giải quyết vấn đề và sau đó yêu cầu trợ giúp giải pháp của bạn. –

1

Cách mà optparseargparse làm việc là họ đọc đối số từ dòng lệnh, tham số được chia bởi màu trắng-không gian, vì vậy nếu bạn muốn nhập danh sách các số nguyên qua interfact dòng lệnh từ optparse hoặc argparse - bạn có thể làm điều này bằng cách loại bỏ các khoảng trống, hoặc xung quanh tranh cãi của bạn với ", ví dụ:

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

hay:

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

sc của bạn ript sau đó cần phải chuyển đổi các đầu vào này thành một danh sách thực tế.

Sử dụng argparse cú pháp (rất giống nhau cho 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(',')] 

Một cách khác để làm điều này sẽ bằng hoặc nhập khẩu các module bạn muốn chạy và đi qua danh sách các đối tượng đến một lớp học mà giao dịch với mã của bạn hoặc bằng cách sử dụng vòng lặp while và raw_input/input để thu thập danh sách mong muốn.

1

Nếu chỉ đối số là các danh sách và các dải phân cách, bạn có thể làm điều đó tương đối đơn giản:

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

Thêm xác nhận là đơn giản:

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

Sản xuất thông báo trợ giúp:

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

Tôi thích cách tiếp cận của bạn, làm cách nào để cung cấp trợ giúp về tham số đầu vào và bất kỳ xác thực nào về dải ô? – Swati

28

argparse hỗ trợTham số, cho bạn biết số lượng tham số mà nó ăn. Khi nargs="+" nó chấp nhận một hoặc nhiều tham số, vì vậy bạn có thể vượt qua -b 1 2 3 4 và nó sẽ được chỉ định như một danh sách để b luận

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

Vì vậy, bạn có thể chạy:

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

Và đây là hợp lệ:

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

quyết định tốt! đúng nếu cần liệt kê 50 số, không phải 5, dài) –

+0

Tại sao u sử dụng bộ? – Swati

+0

Vì những gì bạn yêu cầu * được * đặt kiểm tra. Khi bạn kiểm tra xem B có ở A, * nó được đặt hoạt động * - hãy kiểm tra xem tập hợp b - set a có rỗng không. Đối với các phạm vi, tôi có thể sử dụng 'min (a)> = 1 và max (a) <= 50', mặc dù tôi muốn nhất quán. Bạn hỏi về "Danh sách 2 là tập con của List1.", Không? –

3

này đã làm việc cho tôi:

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

Các vấn đề liên quan