2013-12-09 4 views
0

Я пытаюсь написать этот код, используя карту и встроенные функции фильтра. Как мне это сделать?Как преобразовать эти две петли с помощью карты и фильтра?

for elem in courses_dict: 
    for ele in types: 
      for element in types[ele]: 
       if elem==element: 
        courses_dict[elem]+=factors[ele] 
+1

Зачем вы хотите конвертировать это в карту и фильтровать? Результатом будет нечитаемый behemoth – inspectorG4dget

+0

Неправильно использовать типы [ele] ... , выполнив «для ele в типах», ele уже является элементом ваших типов списка, а не индексом элемента списка. – carla

+1

В этом же блоке данных много ярлыков 'element'. Это может быть проще (даже для вас!) Быть вынужденным использовать более конкретные имена ;-) –

ответ

1

Вот измененный код из вашего вопроса, который предполагает, что 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 содержат; вместо более абстрактных можно использовать более конкретные имена. Но это все равно было бы уродливо.

Смежные вопросы