尝试从 dict.items() 返回值不起作用



有一个问题是必须在这里解决它是

您将获得一串介于 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(( 返回值

结果应该是"四"。但是你的平均公式是错误的:你必须求和然后除法而不是减去。

因此,当你在字典中循环(多么奇怪的想法?(时,你找不到值,所以你到达函数的末尾,在这种情况下,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放入字典中,我能够从字母转换为数字,然后再转换回来,没有任何循环,以受益于快速的字典/列表查找。

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

最新更新