Как я могу вернуть номер последнего элемента из кортежа, который удовлетворяет условию?

Как я могу вернуть наибольшее число в отсортированном кортеже an, которое все еще меньше заданного числа (отношения)?

Вот мой код:

def returnPrevious(width, height):
    an = (2,3,4,6,8,9,12)
    z = -1
    for i in an:
        if (width//height) >= i:
         z += 1   
        else: break
    return an[z]

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

Yaroslav Fyodorov 13.12.2020 09:35

это работает, я прошу лучший способ сделать это, мне не нравится использование z. В любом случае, спасибо

Andreas Papachristos 13.12.2020 09:37

Итак, можете ли вы объяснить, какова цель этого кода — найти первую запись, которая больше width // height?

Yaroslav Fyodorov 13.12.2020 09:39

Зачем тебе z? Вы можете просто вернуть i, когда оно больше ширины//высоты. Что должно происходить, когда такого i нет?

Yaroslav Fyodorov 13.12.2020 09:41

да, но мне нужно вернуть предыдущий

Andreas Papachristos 13.12.2020 09:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
70
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вместо этого вы могли бы использовать что-то вроде этого, вы не избавились бы от z, но это чище

def returnPrevius(width, height):
    an = (2,3,4,6,8,9,12)
    z = None
    for i in an:
        if (width//height) >= i:
         z = i  
        else: break
    return z

Лучше звонить zprev или что-то в этом роде

Yaroslav Fyodorov 13.12.2020 09:42
Ответ принят как подходящий

Если вы измените порядок чисел, вы можете просто вернуть первое совпадение:

def returnPrevious(width, height):
    an = (12,9,8,6,4,3,2)
    for i in an:
        if width//height >= i:
            return i
    return None

Вы даже можете сделать это в одном выражении, используя next(), который возвращает первый элемент из итерации, или значение по умолчанию по нашему выбору (None), если итерация пуста.

def returnPrevious(width, height):
    return next((i for i in (12,9,8,6,4,3,2) if width//height >= i), None)

Это хорошо, особенно по умолчанию None

Yaroslav Fyodorov 13.12.2020 09:59

Вы можете сделать это

import itertools
def findLast(w,h):
   r = w//h
   return list(itertools.takewhile(lambda e: e < r, an))[-1]

или

def findLast(w,h):
   r = w//h
   return [e for e in an if e < r][-1]

Но он создает список, который вам не нужен только для того, чтобы взять из него последний элемент.

Что вы можете сделать, так это перевернуть список и найти первый элемент, который соответствует вашему условию, тогда вам не нужно запоминать предыдущий элемент. Но вам все равно нужно обработать случай, когда такого элемента нет. Или добавьте 0 в перевернутый список как последний элемент.

Другие вопросы по теме