所以我在 Stack Overflow 用戶的幫助下創建了這段代碼。
def get_name(string):
return string.replace(" ", "").replace("-", "")
def gnames(input_list: list):
output = {}
for entry in input_list:
if '->' in entry:
names = entry.split('->')
output[names[1]] = output[names[0]]
output[names[0]] = 0
else:
name = get_name(entry)
if name not in output:
output[name] = 0
if " " in entry:
output[name] = 1
if "--" in entry:
output[name] -= 1
return output
print(gnames(["Jim--", "John--", "Jordan--", "Jim ", "John--", "Jeff--", "June ", "June->Jim"]))
這回傳
{'Jim': 1, 'John': -2, 'Jordan': -1, 'Jeff': -1, 'June': 0}
現在這是正確的,但我只想gnames()回傳非零值負數或正數都可以
所以在我的例子中,有 'June' = 0
我想要gnames()排除的輸出,'June' = 0或者如果任何其他人有 0...我想gnames()排除它...
所以我在這種情況下的輸出應該回傳
{'Jim': 1, 'John': -2, 'Jordan': -1, 'Jeff': -1}
我怎樣才能做到這一點??
uj5u.com熱心網友回復:
字典理解使這變得非常簡單。如果我們開始就gnames為{'Jim': 1, 'John': -2, 'Jordan': -1, 'Jeff': -1, 'June': 0}我們可以寫一本字典的理解,將過濾掉零值。
>>> gnames = {'Jim': 1, 'John': -2, 'Jordan': -1, 'Jeff': -1, 'June': 0}
>>> {k: v for k, v in gnames.items() if v != 0}
{'Jim': 1, 'John': -2, 'Jordan': -1, 'Jeff': -1}
>>>
uj5u.com熱心網友回復:
同樣使用字典理解,你可以像這樣改變你的回報:
return {x:output[x] for x in output if output[x] != 0}
描述它的作用:
# for each element in output
# if element['name'] != 0 then keep it
完整代碼:
def get_name(string):
return string.replace(" ", "").replace("-", "")
def gnames(input_list: list):
output = {}
for entry in input_list:
if '->' in entry:
names = entry.split('->')
output[names[1]] = output[names[0]]
output[names[0]] = 0
else:
name = get_name(entry)
if name not in output:
output[name] = 0
if " " in entry:
output[name] = 1
if "--" in entry:
output[name] -= 1
return {x:output[x] for x in output if output[x] != 0}
print(gnames(["Jim--", "John--", "Jordan--", "Jim ", "John--", "Jeff--", "June ", "June->Jim"]))
# Sample output
# {'Jim': 1, 'John': -2, 'Jordan': -1, 'Jeff': -1}
uj5u.com熱心網友回復:
如果你想避免顯式in檢查字典中是否存在鍵,首先設定默認值0,你可以使用 a collections.defaultdict,它是一個dict子型別,如果鍵不在字典中,它會自動設定默認值。
所以你的代碼可以用 簡化defaultdict(int),然后用符號到增量(更改)映射進行輕微改進,最后你可以選擇從dict加法結果中洗掉鍵,如果加法結果是一個0值;這可以用來完全避免dict在 return 陳述句中理解的需要。
所以現在添加所有更改后,端到端代碼如下所示:
from collections import defaultdict
def get_name(string):
return string.replace(" ", "").replace("-", "")
def gnames(input_list: list):
output = defaultdict(int)
sign_to_delta = {' ': 1,
'--': -1}
for entry in input_list:
if '->' in entry:
from_, to = entry.split('->')
# Use `pop` to retrieve and also delete the key from dict
# instead of assigning the value as 0, which is already the
# default behavior if the key is not present.
output[to] = output.pop(from_)
else:
name = get_name(entry)
for sign in sign_to_delta:
if sign in entry:
result = output[name] sign_to_delta[sign]
if result:
output[name] = result
else:
del output[name]
return output
print(gnames(["Jim--", "John--", "Jordan--", "Jim ", "John--", "Jeff--", "June ", "June->Jim"]))
print(gnames(["Jean ", "Jean--", "Jean--", "Jean "]))
出去:
defaultdict(<class 'int'>, {'John': -2, 'Jordan': -1, 'Jeff': -1, 'Jim': 1})
defaultdict(<class 'int'>, {})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363635.html
