【问题标题】:trying to return value from dict.items() is not working试图从 dict.items() 返回值不起作用
【发布时间】:2019-02-04 22:09:30
【问题描述】:

这里有个问题要解决就是了

给你一串 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"))

为什么它返回 None 还有另一种方法比较并从 dict.items() 中返回一个值

【问题讨论】:

  • 如果k 永远不等于floorN,则函数返回None。在这种情况下你应该返回一些东西(在 for 循环的末尾)
  • 另外,使用这样的字典是可疑的。
  • 我是如何让这个偏离轨道的 smh
  • 你的平均公式是错误的:使用floor(sum(converter) / len(converter))
  • 谢谢你我完全忘记了那是当你很快看一个公式而不注意但你为什么说使用这样的字典很可疑我有兴趣知道另一种方式@Jean-FrançoisFabre

标签: python-3.x list dictionary return


【解决方案1】:

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

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

所以修正公式,然后使用 整数除法 转换回索引而不是地板,因此所有内容都保留为整数,并使用 x 转换为字母字符串:

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 放入字典中,我可以在没有任何循环的情况下从字母转换为数字并返回,从而受益于快速的字典/列表查找。

【讨论】:

    【解决方案2】:

    要减少要使用的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
    

    【讨论】:

      猜你喜欢
      • 2018-07-12
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 2017-10-28
      • 2016-04-07
      相关资源
      最近更新 更多