这里有一个问题就是解决它
您将获得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在这种情况下返回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
放入字典中,我就可以将字母转换为数字并返回,无需任何循环,从快速字典/列表查找中受益。
要减少使用的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