Я делаю функцию isSiete (), которая будет принимать целое число из текстового файла с 5000 случайными числами.

Верните True, если цифра второго столбца (столбец «десятки») числа равна ‘7 ', и False, если это не так.

def isSiete(num):
    numString = str(num)
    numList = list(numString)
    numSum = 0
    for i in numList:
        if ('0' + i)[-2] == '7':
            return True
        else:
            return False

Я ожидаю, что результат будет True, но я получаю False каждый раз. Я пробовал следующие тестовые номера

IsSiete (7777) isSiete (4774) isSiete (672)

1
quadratini7 3 Июл 2019 в 21:47

4 ответа

Лучший ответ

Не беспокойтесь о строках вообще; делить на 10 на порядок быстрее.

def isSiete(num):
    return num // 10 % 10 == 7

Арифметика становится медленнее с увеличением размера num, но это все еще быстрее, когда num представляет собой 17-значное число.

2
chepner 3 Июл 2019 в 19:03

Ваш ('0' + i)[-2] всегда равен символу '0'

Например, предположим, что numList == ['A', 'P', 'P', 'L', 'E'] Предположим, что i является элементом numList, таким как 'P'

Тогда '0' + i == "0P"

[-2] получает второй за последним символ
"0P"[-2] == "0"

Обратите внимание, что не имеет значения, что такое P. Второй до последнего персонажа '0' + i всегда '0'

('0' + i)[-2] == '7' всегда будет возвращать False


Я рекомендую вам узнать о "операторе модуля" (%)

x % 10 - это остаток от x, деленный на 10. Например, 74 % 10 == 4

В общем случае x % y является остатком от x при делении на y

Чтобы извлечь конкретную цифру из числа, сделайте следующее:

def extract_digit(number, position):
    """
    position == 1 ......if you want the ones place
    position == 2 ......if you want the tens place
    position == 3 ......if you want the hundredths place
    position == 4 ......if you want the thousanths place
    and so on...
    """ 
    small_places = number % (10**position)
    digit = small_places //(10**(position - 1))
    return digit

Например, предположим, что вы хотите получить сотню 123456789:

123456789 % 1000 == 789      
789 // 100 == 7

В итоге мы имеем:

def isSiete(num):
    return extract_digit(num, 2) == 7
1
Toothpick Anemone 4 Июл 2019 в 00:44

Я не уверен, просили ли вы помочь отладить ваш код или вам нужна помощь с рабочим решением.

В случае, если вы хотели решения: вот рабочий фрагмент, который может помочь вам достичь того, что вы хотели.

def is_siete(num):
    """
    Asserts that the tens of a number is 7. Returns False if not.
    """
    num_as_str = str(num)

    try:

        second_num_as_str = num_as_str[-2]
        second_num_as_int = int(second_num_as_str)

        if second_num_as_int == 7:
            return True

        return False

    except IndexError:
        return False


if __name__ == "__main__":
    print(is_siete(7777))  # True
    print(is_siete(4774))  # True
    print(is_siete(672))  # True
    print(is_siete(17))  # False
    print(is_siete(7))  # False

0
Igor G.Peternella 3 Июл 2019 в 19:01

Вы можете просто использовать преобразованную строку, чтобы проверить ваше состояние, так как строка в Python работает как массив символов:

def isSiete(num):
    numString = str(num)
    tensPosition = len(numString) - 2

    if tensPosition >= 0 and numString[tensPosition] == '7':
        return True
    else:
        return False
0
Omari Celestine 3 Июл 2019 в 18:58