如何使用map和filter转换这两个循环?

时间:2013-12-09 09:24:08

标签: python

我尝试使用map和filter内置函数编写此代码。我该怎么办?

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

1 个答案:

答案 0 :(得分: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]

type_values有[{1}}方法,例如,它是一个列表。

显式循环很好。如果您想了解如何使用.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_dicttypes包含;可以使用更好的更具体的名称来代替上面的抽象名称。但它仍然是丑陋的。