我正在制作一個程式,其中第一個引數是一個串列,第二個引數是一個字典串列。我想回傳這樣的串列串列:
例如,如果這是一個函式呼叫:
make_lists(['Example'],
[{'Example': 'Made-up', 'Extra Keys' : 'Possible'}]
)
預期的回報值為:
[ ['Made-up'] ]
作為第二個例子,如果這是一個函式呼叫:
make_lists(['Hint', 'Num'],
[{'Hint': 'Length 2 Not Required', 'Num' : 8675309},
{'Num': 1, 'Hint' : 'Use 1st param order'}]
)
預期的回報值為:
[ ['Length 2 Not Required', 8675309],
['Use 1st param order', 1]
]
我為此撰寫了一個代碼,但我的代碼不回傳串列串列,它只回傳一個串列。請問有人可以解釋一下嗎?
def make_lists(s,lod):
a = []
lol =[]
i = 0
for x in lod:
for y in x:
for k in s:
if(y==k):
lol.append(x.get(y))
i = i 1
return lol
預期輸出:
[ ['Length 2 Not Required', 8675309],['Use 1st param order', 1] ]
輸出:
['Length 2 Not Required', 8675309, 1, 'Use 1st param order']
uj5u.com熱心網友回復:
字典的全部意義在于您可以通過鍵訪問它們:
def make_lists(keys, dicts):
result = []
for d in dicts:
vals = [d[k] for k in keys if k in d]
if len(vals) > 0:
result.append(vals)
return result
讓我們來看看這里發生了什么:
我們仍然有一個result陣列,它累積了答案,但現在它被呼叫result而不是lol
接下來我們遍歷每個字典:
for d in dicts:
對于每一個詞典d,我們創建了一個串列,其中包含在字典中的鍵查找keys,如果該鍵k在字典d:
vals = [d[k] for k in keys if k in d]
規范沒有詳細說明這一點,但我假設如果字典中沒有任何鍵,您不希望將其添加到陣列中。為此,我們檢查是否vals有任何結果,然后才將其添加到結果中:
if len(vals) > 0:
result.append(vals)
uj5u.com熱心網友回復:
試試這個代碼 - 我已經設法稍微修改了你現有的代碼,并在評論中添加了解釋。本質上,您只需要使用一個子串列并將其添加到主串列lol,然后在每個回圈迭代中的元素lod,附加到子串列而不是最外面的串列。
def make_lists(s,lod):
a = []
lol =[]
i = 0
for x in lod:
## Added
# Here we want to create a new list, and add it as a sub-list
# within 'lol'
lols = []
lol.append(lols)
## Done
for y in x:
for k in s:
if(y==k):
# Changed 'lol' to 'lols' here
lols.append(x.get(y))
i = i 1
return lol
print(make_lists(['Example'], [{'Example': 'Made-up', 'Extra Keys' : 'Possible'}]))
print(make_lists(['Hint', 'Num'], [{'Hint': 'Length 2 Not Required', 'Num' : 8675309}, {'Num': 1, 'Hint' : 'Use 1st param order'}]))
印刷:
[['Made-up']]
[['Length 2 Not Required', 8675309], [1, 'Use 1st param order']]
更簡單的解決方案
為了更干凈(并且可能更有效的方法),我建議使用類似的內置函式map并使用list理解來解決這個問題:
def make_lists(s, lod):
return [[*map(dict_obj.get, s)] for dict_obj in lod]
但請注意,這種方法包括元素,因為None在slist 中的字典物件中不存在所需鍵的情況下lod。
要解決此問題,您可以將 的結果傳遞map給filter內置函式,以便None在結果中洗掉值(代表字典中缺少的鍵):
def make_lists(s, lod):
return [[*filter(None, map(dict_obj.get, s))] for dict_obj in lod]
print(make_lists(['Example'], [{'Extra Keys' : 'Possible'}]))
print(make_lists(['Hint', 'Num'], [{'Num' : 8675309}, {'Num': 1, 'Hint' : 'Use 1st param order'}]))
輸出:
[[]]
[[8675309], ['Use 1st param order', 1]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/347789.html
