Вот измененный код из вашего вопроса, который предполагает, что types
отображение: type_id
->types
:
for course_id in courses_dict:
for type_id, type_values in types.items(): # assume `types` is a mapping
for type in type_values:
if course_id == type:
courses_dict[course_id] += factors[type_id]
Вы могли бы сделать внутреннюю петлю неявной:
for course_id in courses_dict:
for type_id, type_values in types.items(): # assume `types` is a mapping
count = type_values.count(course_id) # assume `.count` is present
if count: # course_id in type_values
courses_dict[course_id] += count*factors[type_id]
It type_values
имеет метод .count()
, например, это список.
Явные петли в порядке, как есть. Если вы хотите увидеть, как она может быть написана с использованием map
, filter
по академическим причинам:
from collection import deque
from itertools import product, starmap
pairs = product(courses_dict, types)
# course_id == p[0] and type_id == p[1]
triples = map(lambda p: (types[p[1]].count(p[0]),) + p, pairs)
triples = filter(lambda t: t[0], triples) # count == t[0]
def increment(count, course_id, type_id):
courses_dict[course_id] += count * factors[type_id]
deque(starmap(increment, triples), maxlen=0) # "consume" recipe from itertools
Если бы я знал, что ваши входные значения: courses_dict
, types
, factors
содержат; вместо более абстрактных можно использовать более конкретные имена. Но это все равно было бы уродливо.
Зачем вы хотите конвертировать это в карту и фильтровать? Результатом будет нечитаемый behemoth – inspectorG4dget
Неправильно использовать типы [ele] ... , выполнив «для ele в типах», ele уже является элементом ваших типов списка, а не индексом элемента списка. – carla
В этом же блоке данных много ярлыков 'element'. Это может быть проще (даже для вас!) Быть вынужденным использовать более конкретные имена ;-) –