[英]Python argument parser list of list or tuple of tuples
我正在嘗試使用參數解析器來解析 3D 坐標,以便我可以使用
--cord 1,2,3 2,4,6 3,6,9
並得到
((1,2,3),(2,4,6),(3,6,9))
我的嘗試是
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--cord', help="Coordinate", dest="cord", type=tuple, nargs=3)
args = parser.parse_args(["--cord","1,2,3","2,4,6","3,6,9"])
vars(args)
{'cord': [('1', ',', '2', ',', '3'),
('2', ',', '4', ',', '6'),
('3', ',', '6', ',', '9')]}
逗號的替換是什么?
您可以添加自己的類型 。 這還允許進行其他驗證,例如:
def coords(s):
try:
x, y, z = map(int, s.split(','))
return x, y, z
except:
raise argparse.ArgumentTypeError("Coordinates must be x,y,z")
parser.add_argument('--cord', help="Coordinate", dest="cord", type=coords, nargs=3)
對於我的問題,我必須有一個更通用的方法,而不是與輸入的數量相關聯。
從喬治的精彩回答開始,我解決了我的問題如下
# additional type
def coords(s):
seps = r'[ ;.]'
try:
situp = []
for si in re.split(seps, s):
situp.append(tuple(map(int, si.split(','))))
return situp
except:
raise argparse.ArgumentTypeError("Coordinates must be given divided by commas and space, dot, or semicolon e.g.: 'x,y k,l,m'")
有了這個,像1,2 3,4,5
這樣的輸入將變成像[(1,2), (3,4,5)]
這樣的元組列表
編輯:可能是 for 循環不是最佳的,但我寫它是為了避免使用nargs
編輯2:
有一個列表列表,一個人應該改變
線situp.append(tuple(map(int, si.split(','))))
與situp.append(list(map(int, si.split(','))))
有一個 uples 元組,你可以改變回報
return tuple(situp)
我不能在這里發表評論,但想建議在 georgs 答案中添加 soneting,因為可能會出現一些混淆,因為 x,y,z 通常被假定為標量值而不是向量或 3 項數組,即如果在這個解決方案中你想要要讀取 x,y,z (如異常告訴您的那樣),您會想到 1.0,2.0,3.0 之類的東西,您需要 nargs=1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.