所以我在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}
我怎么能这么做??
如果要避免在中使用显式的,请先检查字典中是否存在该键,否则请将默认值设置为
0
,您可以使用集合。defaultdict
是一种dict
子类型,如果键不在dict中,它会自动设置默认值。
因此,您的代码可以简化为
default法规(int)
,然后用一个符号到delta(更改)映射进行轻微改进,最后,如果添加的结果是,您可以选择从
值;这可以用来避免在返回语句中完全需要法规
中删除键0判断
理解。
现在添加了所有更改后,端到端代码如下所示:
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'>, {})
此外,使用字典理解,您可以更改您的报税表,如下所示:
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}
字典理解使这变得非常简单。如果我们从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}
>>>
例如,如果我有一个Person父类和一个学生扩展Person子类,是否有办法实现equals()或hashCode()函数,其中它们的实例不会彼此相等? 假设Person类有字段name和age。学生类具有字段等级和以下构造函数: 如果一个是Person的实例,另一个是Student的实例,那么我如何创建两个具有匹配字段的实例,但如果其中一个是该实例,那么它将返回false? 是否可以使stude
嗨,我正在尝试一个html表单代码的程序,我想要隐藏一个元素,如果一个条件被触发。 我是一个新手,目前正在学习javascript。代码如下: 我想隐藏返回航班,如果“只有一种方式”复选框被触发。 你可以忽略这个程序这里是我的服务器的链接
我在试着做个背景效果。在按键时,它创建一个div并在半秒后淡出。每次按下一个键,它都会创建一个具有新ID的新div。我如何在每个div被触发后半秒内删除它? 我忘记提了,我有一个函数可以将缩短为。我没有使用jQuery。 这是我目前为止的代码。
要从复杂对象中删除某些字段。 我想删除'阴谋'
关于这个问题:这是什么是堆栈跟踪的直接扩展,我如何使用它来调试我的应用程序错误?只不过您查看的是Gradle堆栈跟踪,而不是Java堆栈跟踪。
问题内容: 我该如何忽略和制造? 问题答案: 分母之前检查分母是否为零。这样可以避免捕获异常的开销,如果您希望将其除以零,则可能会更有效率。