Как преобразовать вложенные циклы for с несколькими внутренними циклами в функцию map()?

Я пытался ускорить некоторые вложенные циклы for с несколькими внутренними циклами в Python 3.11:

for item1 in iterable1:
    for item2 in interable2:
        if condition == true:
            expression1
    for item3 in interable3:
        if condition2 == true:
            expression2

Обратите внимание, что 2-й и 3-й циклы for находятся на одном уровне и не являются вложенными, в отличие от Этот Вопрос.

Я узнал, что понимание списков и функция map() обычно работают намного быстрее, чем циклы forВот, и я пытаюсь преобразовать свои вложенные циклы в map() функцию(и).

Может кто-нибудь объяснить, как создавать такие map() функции и/или списки?

Я думал, что проведу небольшое исследование - наверняка в Интернете найдется ответ на такую ​​проблему, но остался с пустыми руками. некоторые используемые ресурсы включают:

Можете ли вы заменить утверждения input жестко закодированными данными? сложно понять ваш вопрос без минимального воспроизводимого примера.

Lord Elrond 13.07.2024 22:14

@LordElrond, окей, я сделаю это прямо сейчас!

F-22 Destroyer 13.07.2024 22:21

«Я узнал, что понимание списка и функция map() обычно работают намного быстрее, чем циклы for Здесь» - Хм... этот связанный ответ, кажется, говорит прямо противоположное.

no comment 13.07.2024 22:28

@F-22Разрушитель. И можете ли вы удалить код комментария.

mightycode Newton 13.07.2024 22:29

@nocomment, имел в виду следующие несколько ответов, извини

F-22 Destroyer 13.07.2024 22:32

удален код комментария

F-22 Destroyer 13.07.2024 22:33

Мой второй вопрос...

F-22 Destroyer 13.07.2024 22:33

@mightycodeNewton не я

F-22 Destroyer 13.07.2024 22:37

Показывая минимальный воспроизводимый пример, убедитесь, что он работает, поскольку set('A', 'B') не является допустимым Python. Кроме того, если вы заявляете о необходимости ускорить процесс, покажите контрольные значения: вы повторяете тривиальное количество элементов, зачем вам это оптимизировать? Какую на самом деле проблему вы пытаетесь решить? (например, что делает ваш реальный код, который вы протестировали и профилировали, а также определили конструкции циклов как горячие точки).

Mike 'Pomax' Kamermans 13.07.2024 22:38

@F-22Разрушитель. окей, но ответ, который я опубликовал, это то, что вы хотите?

mightycode Newton 13.07.2024 22:38

@mightycodeNewton вроде...

F-22 Destroyer 13.07.2024 22:38

позвольте мне исправить мой вопрос

F-22 Destroyer 13.07.2024 22:39

это мой второй звук

F-22 Destroyer 13.07.2024 22:39

Их, просто забудь про второй блок кода

F-22 Destroyer 13.07.2024 22:41

Обычно вы используете либо карту, либо понимание списка. Здесь вы можете составить сложное sum выражение понимания. Он будет повторять то же самое, что и ваш основной цикл for, и заполнять логический двухкортеж. Затем сумма будет использовать комбинацию list/zip/unpack для получения удовлетворенных и неудовлетворенных. Код будет очень трудно читать, и я готов поспорить, что вы не добьетесь заметной производительности. Ваш код меня устраивает.

MufasaChan 13.07.2024 22:41

@Mike'Pomax'Kamermans dmoj.ca/problem/ccc22s2

F-22 Destroyer 13.07.2024 22:41

последняя партия имеет более 300 000 входов

F-22 Destroyer 13.07.2024 22:42

Не говорите мне, расскажите всем, отредактировав свой пост. Если вы выполняете онлайн-упражнения, расскажите об этом в своем посте. Пожалуйста (пере)прочитайте правила публикации и отредактируйте свое сообщение соответствующим образом. Если люди задают вам вопросы, это потому, что в вашем сообщении не указаны детали, которые вам нужно добавить (переписав его так, чтобы это был полный вопрос. Не используйте разделы «изменить: ....», правильно обновите текст сообщения: это будет оставаться здесь еще долгие годы, и будущие посетители должны иметь возможность понять, является ли ваш вопрос из прошлого их «текущим» вопросом).

Mike 'Pomax' Kamermans 13.07.2024 22:49
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
18
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне кажется, вы путаете несколько понятий:

Во-первых, понимание списков и циклы for — это одно и то же. Понимание списка — это просто более компактный способ написания цикла for. Вы можете переписать любое понимание списка как цикл for без существенного изменения производительности.

Например, если вы начнете со следующего цикла for:

iterable1 = ["a", "b", "c", "a", "e", "f", "a"]
result = []

for item in iterable1:
    if item == "a":
        result.append(item + "FOO")
    else:
        result.append(item)


print(result)
# ['aFOO', 'b', 'c', 'aFOO', 'e', 'f', 'aFOO']

Вы можете выразить это как понимание списка следующим образом:

iterable1 = ["a", "b", "c", "a", "e", "f", "a"]
result = [item + "FOO" if item == "a" else item for item in iterable1]

print(result)
# ['aFOO', 'b', 'c', 'aFOO', 'e', 'f', 'aFOO']

Два приведенных выше примера совершенно взаимозаменяемы — ни один из них не превосходит другой — это просто разные способы сказать одно и то же.

Если вы хотите использовать карту(), вы можете сделать это следующим образом:

iterable1 = ["a", "b", "c", "a", "e", "f", "a"]
conditional1 = lambda item: item == "a"
expression1 = lambda item: item + "FOO" if conditional1(item) else item
result = list(map(expression1, iterable1))

print(result)
# ['aFOO', 'b', 'c', 'aFOO', 'e', 'f', 'aFOO']

Использование map() существенно отличается от использования цикла, но использование понимания списка ничем не отличается от использования цикла.

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