簡體   English   中英

從 python 中的列表中錯誤地訪問值

[英]accessing values incorrectly from list in python

我有兩個示例文件。

myheader.h

#define MACRO1 42
#define lang_init ()  c_init()
#define min(X, Y)  ((X) < (Y) ? (X) : (Y))

和 pyparser.py

from pyparsing import *
# define the structure of a macro definition (the empty term is used 
# to advance to the next non-whitespace character)
macroDef = "#define" + Word(alphas+"_",alphanums+"_").setResultsName("macro") + \
            empty + restOfLine.setResultsName("value")
with open('myheader.h', 'r') as f:
    res = macroDef.scanString(f.read())
    res = list(res)
    print(res[0])
    print(res[1])
    print(res[2])

output 是

((['#define', 'MACRO1', '42'], {'macro': ['MACRO1'], 'value': ['42']}), 0, 17) ((['#define', 'lang_init', '() c_init()'], {'macro': ['lang_init'], 'value': ['() c_init()']}), 18, 48) ((['#define', 'min', '(X, Y) ((X) < (Y)? (X): (Y))'], {'macro': ['min'], 'value': ['(X, Y) ((X) < (Y)? (X): (Y))']}), 49, 91)

我以為 print(res[0]) 會打印“#define”,print print(res[1]) 會打印“MACRO1”等等。 我不太熟悉 Python,但我假設 res 不是數組,對嗎? 在這種情況下索引如何工作? 謝謝

問題,len(res) 的值是多少。

在 python 中,當您在列表中有一個列表時,您可以使用第二個索引器來訪問其中的元素。 因此,例如,如果第一個元素 res[0] 是一個列表,您可以執行 res[0][0] 以獲得“#define”。

但是,您顯示的 output 的格式與典型的嵌套列表語法不同,因此執行 res[0][0] 可能不起作用(因為它可能不是正確的對象類型)。

嵌套列表應該是這樣的:[[0, 1], [1, 2, 100], [2, 3], [3, 4], [4, 5]]

你的 output 看起來像它的 json 格式,但不知道數據類型 object 我肯定不能確定。 如果它是 json,您可以執行 json.loads(res) 然后以這種方式解析它。 https://www.freecodecamp.org/news/python-json-how-to-convert-a-string-to-json/

您的部分困惑源於對從 scanString 返回的內容的誤解。 scanString(這是新方法 scan_string 的遺留兼容性名稱)實際上是一個生成器,它為每個找到的匹配項生成一個元組。 元組包含:

  • 將一些文本與掃描表達式匹配返回的 ParseResults
  • 找到文本的起始 position
  • 找到文本的結尾 position

如果您不想要 position 值,請改用 search_string,它將只返回每個匹配項的 ParseResults 列表。

查看在線文檔,了解有關如何使用 scan_string、search_string、ParserElements 和 ParseResults 的更多詳細信息。 https://pyparsing-docs.readthedocs.io/en/latest/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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