請幫助實作以下功能:
給定一個字串和串列的串列,其中也可能包含字串和串列等。您的作業是將這些字串收集到一個字典中,其中 key 是字串,value 是這些串列中該字串出現的次數。
def count_strings(data: list, pos=None, result: dict = None) -> dict:
"""
:param data: given list of lists
:param pos: figure out how to use it
:param result: figure out how to use it
:return: dict of given symbols and their count
"""
我的嘗試:
if result is None and pos is None:
result = {}
pos = 0
if pos > len(data):
return result
if isinstance(data[pos], str):
return count_strings(data, pos 1, result)
elif isinstance(data, list):
return count_strings(data, 0, result)
輸出應該是這樣的:
print(count_strings([[], ["J", "*", "W", "f"], ["j", "g", "*"], ["j", "8", "5", "6", "*"], ["*", "*", "A", "8"]]))
# {'J': 1, '*': 5, 'W': 1, 'f': 1, 'j': 2, 'g': 1, '8': 2, '5': 1, '6': 1, 'A': 1}
print(count_strings([[], [], [], [], ["h", "h", "m"], [], ["m", "m", "M", "m"]])) # {'h': 2, 'm': 4, 'M': 1}
print(count_strings([])) # {}
print(count_strings([['a'], 'b', ['a', ['b']]])) # {'a': 2, 'b': 2}
uj5u.com熱心網友回復:
您獲得的模板并沒有促進最佳實踐(請參閱改變引數的 Python 函式的正確樣式),但忽略這一點,您的代碼存在以下問題:
if pos > len(data): 這錯過了這兩個相等的情況,在這種情況下你也應該進入那個if塊- 您的代碼不會使用實際計數更新字典。特別是當檢查的值是字串時應該發生這種情況
- 串列資料型別的測驗使用了錯誤的值:您將要測驗它
data[pos]是一個串列,而不是data. - 當值是一個串列時,您應該使用該子串列進行遞回,因此使用
data[pos] - 當值為串列時,您仍應處理主串列的其余部分。
這是一個更正:
def count_strings(data: list, pos=None, result: dict = None) -> dict:
if result is None and pos is None:
result = {}
pos = 0
if pos < len(data): # pos should not be equal to len when accessing data[pos]:
if isinstance(data[pos], str):
result[data[pos]] = result.get(data[pos], 0) 1 # increment count
elif isinstance(data[pos], list):
count_strings(data[pos], 0, result) # process nested list
count_strings(data, pos 1, result) # process the remaining entries
return result
替代函式簽名
如果函式不需要result將要發生變異的pos引數,也不需要引數,那就更好了。雖然您不是在尋找改變您獲得的模板的解決方案,但我仍然更喜歡在此處包含替代方案。
實際上有兩個問題需要解決這里:
- 以遞回方式迭代嵌套值,以及
- 在字典中收集字串頻率
這兩者可以在單獨的函式中解決。在不使用庫的情況下,您可以按如下方式執行此操作:
def deepvalues(data):
if isinstance(data, list):
for item in data:
yield from deepvalues(item) # recursion
else:
yield data
def count_strings(data: list) -> dict:
result = {}
for value in deepvalues(data):
result[value] = result.get(value, 0) 1
return result
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344895.html
上一篇:PHP中的遞回檔案夾樹
