当前位置: 首页 > 知识库问答 >
问题:

如果一个元素等于零,我如何让我的输出排除它?[重复]

叶光华
2023-03-14

所以我在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}

我怎么能这么做??

共有3个答案

袁文景
2023-03-14

如果要避免在中使用显式的,请先检查字典中是否存在该键,否则请将默认值设置为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'>, {})

史淳
2023-03-14

此外,使用字典理解,您可以更改您的报税表,如下所示:

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}
萧懿轩
2023-03-14

字典理解使这变得非常简单。如果我们从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堆栈跟踪。

  • 问题内容: 我该如何忽略和制造? 问题答案: 分母之前检查分母是否为零。这样可以避免捕获异常的开销,如果您希望将其除以零,则可能会更有效率。