试图从dict.items()返回值是行不通的

问题描述 投票:2回答:2

这里有一个问题就是解决它

您将获得0-9之间的一串数字。找出这些数字的平均值,并将其作为一个以字符串形式写出的覆盖整数(即:无小数位)返回。例如:

“零九五二” - >“四”

这是我的代码

from math import floor

 x = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight','nine']


def average_string(s):
    s = s.split(' ')
    dnumber = {k: i for i, k in enumerate(x)}
    converter = [l for n, l in dnumber.items() for i in s if n == i]
    floorN = floor(sum(converter) - len(converter))

    for i,k in dnumber.items(): 
          if k == floorN:
             return i #<--is this the problem?

print(average_string("zero nine five two"))

为什么它返回无有没有另一种方式比较并从dict.items()返回一个值

python-3.x list dictionary return
2个回答
1
投票

结果应该是“四”。但是你的平均公式是错误的:你必须求和,然后除以不减。

所以当你在字典中循环(这是一个奇怪的想法?)时,你找不到值,所以你到达函数的末尾,python在这种情况下返回None

所以修复公式,然后使用整数除法转换回索引,以便将所有内容保存为整数,并使用x转换为letter-as-string:

def average_string(s):
    s = s.split(' ')
    dnumber = {k:i for i, k in enumerate(x)}
    converter = [l for n, l in dnumber.items() for i in s if n == i]
    floorN = sum(converter) // len(converter)

    return x[floorN-1]

顺便说一下,你可以将dnumber计算放在函数之外,因为它不依赖于传递的参数(如果有很多调用则更快),你也没有真正有效地使用字典。一个明确的重写将是:

x = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight','nine']
dnumber = {k:i for i, k in enumerate(x)}

def average_string(s):
    converter = [dnumber[w] for w in s.split()]
    floorN = int(sum(converter) / len(converter))
    return x[floorN]

既然我已经将zero放入字典中,我就可以将字母转换为数字并返回,无需任何循环,从快速字典/列表查找中受益。


0
投票

要减少使用的foo-loops的数量,包括sum你可以这样做:

def average_string(s):
    x = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight','nine']
    total = 0
    for i,j in enumerate(x):
        if j in s:
            total += i+1
    return total//len(s.split())

如果您在列表中包含zero,那么您的订单将通过执行以下操作变为0(n)

def average_string(s):
    x = ['zero','one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight','nine']
    total = 0
    count = 0
    for i,j in enumerate(x):
        if j in s:
            total += i
            count += 1
    return total//count
© www.soinside.com 2019 - 2024. All rights reserved.