我的清單 -
[
"Mathematics-2 (21SMT-125)",
"Mid-Semester Test-1",
"40",
"23.5",
"Mid-Semester Test-2",
"40",
"34",
"Disruptive Technologies - 2 (21ECH-103)",
"Experiment-1",
"20",
"19",
"Experiment-2",
"20",
"17",
"Experiment-3",
"20",
"18.5",
]
這個stings串列是使用bs4從html中決議出來的
要轉換的格式:
{
"Subject": {
"Mathematics-2 (21SMT-125)": {
"Mid-Semester Test-1": [40,23.5],
"Mid-Semester Test-2": [40,34]
},
"Disruptive Technologies - 2 (21ECH-103)": {
"Experiment-1": [20,19],
"Experiment-2": [20,17],
"Experiment-3": [20,18.5]
}
}
}
uj5u.com熱心網友回復:
問題是您提供的串列是專案的平面串列,沒有指示它們在所需結構中的層次位置。
您可以考慮的一種方法是,如果表示父物件(數學等)的條目是唯一包含括號的條目,您可以迭代您的串列并使用字串匹配或正則運算式來識別父物件,創建一個它的頂級物件,那么您需要將接下來的兩個條目作為鍵/值對的值添加為串列。
這假定您將始終在子級別具有兩個后續值。如果屬性的數量不固定,但它們始終是數字,您可以使用正則運算式來確定它是數字還是非數字,并繼續將專案添加到值串列中,直到您點擊另一個非數字條目,這將被視為層次結構中的下一個兄弟。
uj5u.com熱心網友回復:
我將審查該方法并檢查是否可以以更智能的方式決議來自 bs4 的資訊 - 嘗試做更多的報廢步驟,首先達到主題,然后是“學期/實驗”三年級。
如果不可能并且無法更改從 bs4 回傳的資料。您唯一能做的就是嘗試確定字串是學科名稱、學期名稱還是年級/分數,并嘗試使用一些 while 回圈。學科名稱最后似乎有特殊代碼,可以使用正則運算式與學期/實驗名稱區分開來,成績/分數總是可以決議為數字..
uj5u.com熱心網友回復:
對于與您的資料完全相同的資料(其中帶有 a 的字串(表示頂級條目,并且每個條目始終有兩個數字),您可以提出類似這樣的狀態機 - 但就像我評論的那樣,您真的應該改進您的決議代碼,因為您正在刮取資料的 HTML 可能已經結構化。
def is_float(s):
try:
float(s)
return True
except ValueError:
return False
def parse_inp(inp):
flat_map = {}
stack = []
x = 0
while x < len(inp):
if "(" in inp[x]:
stack.clear()
if is_float(inp[x]) and is_float(inp[x 1]):
flat_map[tuple(stack)] = (float(inp[x]), float(inp[x 1]))
x = 2
stack.pop(-1)
continue
stack.append(inp[x])
x = 1
return flat_map
def nest_flat_map(flat_map):
root = {}
for key_path, values_list in flat_map.items():
dst = root
for key in key_path[:-1]:
dst = dst.setdefault(key, {})
dst[key_path[-1]] = values_list
return root
inp = [
# ... data from original post
]
nested_map = nest_flat_map(parse_inp(inp))
print(nested_map)
這輸出了預期的
{
"Mathematics-2 (21SMT-125)": {
"Mid-Semester Test-1": (40.0, 23.5),
"Mid-Semester Test-2": (40.0, 34.0),
},
"Disruptive Technologies - 2 (21ECH-103)": {
"Experiment-1": (20.0, 19.0),
"Experiment-2": (20.0, 17.0),
"Experiment-3": (20.0, 18.5),
},
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/471056.html
下一篇:復制Python后的串列更改
