簡體   English   中英

元組列表或元組的 Python 參數解析器列表

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

  1. 有一個列表列表,一個人應該改變

    situp.append(tuple(map(int, si.split(','))))

    situp.append(list(map(int, si.split(','))))

  2. 有一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM