如果输出中提供了特定字符串,如何排除某些内容?



所以我在 Stack Overflow 用户的帮助下编写了这段代码,该代码根据"++"还是"--"出现在个人后面将积分转移到个人身上。

def get_name(input):
return input.replace("+", "").replace("-", "")
def keep(actions: list):
g = {}
for s in actions:
if '->' in s:
names = s.split('->')
g[names[1]] = g[names[0]]
g[names[0]] = 0
else:
name = get_name(s)
if name not in g:
g[name] = 0
if "++" in s:
g[name] += 1
if "--" in s:
g[name] -= 1
return {x:g[x] for x in g if g[x] != 0}
print(keep(["Jim++", "John--", "Jeff++", "Jim++", "John--", "John->Jeff",
"Jeff--", "June++", "Home->House"]))

所以大多数程序都没问题,但是,当我"Home->House"放入其中时,它会返回一个KeyError。我有点明白它为什么这样做,但我对如何解决这个问题一无所知......

我尝试浏览互联网寻找解决方案,但他们建议的只是使用 .get(),这并不能真正帮助我解决问题。

如果元素中没有"++"或"--",我如何让我的输出忽略......就像我如何确定输入是否只是"Jim"而不是"Jim++"或"Jim--"一样,该函数会忽略它......

所以在我的示例中,如果keep的输入是

["Jim++", "John--", "Jeff++", "Jim++", "John--", "John->Jeff", "Jeff--", "June++", "Home->House "] 

输出将是

{'Jeff': -2, 'June': 1, 'Jim': 2}

而不是键错误

你会KeyError,因为g[names[1]] = g[names[0]]试图访问字典中不存在的元素。使用简单的print(keep(["John->Jeff"])),您会遇到同样的问题,因为没有先执行++--操作来初始化这些键(g中的"John"和"Jeff"

根据所需的输出,您希望忽略针对不存在的键的此类操作。 将if names[1] in g and names[0] in g:添加到您的keep实现中,即 编辑:还需要g[names[1]] = g[names[0]]更改为g[names[1]] += g[names[0]]产品正确的结果。

def get_name(input):
return input.replace("+", "").replace("-", "")
def keep(actions: list):
g = {}
for s in actions:
if "->" in s:
names = s.split("->")
if names[1] in g and names[0] in g:
g[names[1]] += g[names[0]]
g[names[0]] = 0
else:
name = get_name(s)
if name not in g:
g[name] = 0
if "++" in s:
g[name] += 1
if "--" in s:
g[name] -= 1
return {x: g[x] for x in g if g[x] != 0}

在你的代码中,当你得到Home->House时,这是两个键的第一次出现。这就是为什么当你尝试执行g[names[1] = g[names[0]]时你会得到KeyErrorg[names[0]]g['Home'],但这个条目在你的字典中不存在。您可以简单地解决交换行顺序的问题:

if '->' in s:
names = s.split('->')
g[names[0]] = 0
g[names[1]] = g[names[0]]

要忽略没有"++"或"--"的字符串,您可以在执行get_name(s)之前简单地添加一个 if:

else:
if '++' in s or '--' in s:
name = get_name(s)
if name not in g:
g[name] = 0
if "++" in s:
g[name] += 1
if "--" in s:
g[name] -= 1

此代码返回预期的输出

您的代码实际上确实忽略了在函数的else部分中不包含"++"或"--"的示例。

发生KeyError的原因是,在您尝试将"Home"的条目移动到"House"的条目之前,输入字符串列表中既没有出现"Home"也没有"House"。因为键"家"和"房子"不在你的字典里,g你会得到一个KeyError

下面是一个解决方案,可以满足您的需求。

def get_name(input):
return input.replace("+", "").replace("-", "")
def keep(actions: list):
g = {}
for s in actions:
if '->' in s:
names = s.split('->')
if names[0] in g.keys() and names[1] in g.keys():
g[names[1]] = g[names[0]] + g[names[1]]
g[names[0]] = 0
else:
name = get_name(s)
if name not in g:
g[name] = 0
if "++" in s:
g[name] += 1
if "--" in s:
g[name] -= 1
return {x:g[x] for x in g if g[x] != 0}
print(keep(["Jim++", "John--", "Jeff++", "Jim++", "John", "John--", "John->Jeff",
"Jeff--", "June++", "Home->House"]))

我添加了一个检查,以确保当输入字符串包含"->"时,键存在于字典d中。

为了获得您在问题中指示的输出,其中包括'Jeff': -2,您还需要确保将原始键的值添加到新键的值中。这是在生产线上完成的

g[names[1]] = g[names[0]] + g[names[1]]

否则,输出将显示'Jeff': -3,因为输入字符串"Jeff++"将被忽略。

最新更新