пытается вернуть значение из dict.items () не работает - PullRequest
0 голосов
/ 30 августа 2018

Есть проблема, нужно решить, вот она

Вам дана строка чисел от 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 ()

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Чтобы уменьшить количество используемых 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
0 голосов
/ 30 августа 2018

Результат должен быть «четыре». Но ваша средняя формула неверна: вы должны суммировать делить не вычитать.

Итак, когда вы зацикливаетесь (что за странная идея?) В словаре, вы не находите значение, поэтому вы достигаете конца функции, и 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 в словарь, я могу конвертировать из буквы в цифру и обратно, без каких-либо циклов, чтобы воспользоваться быстрым поиском в формате dict / list.

...