我尝试使用map和filter内置函数编写此代码。我该怎么办?
for elem in courses_dict:
for ele in types:
for element in types[ele]:
if elem==element:
courses_dict[elem]+=factors[ele]
答案 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_dict
,types
包含;可以使用更好的更具体的名称来代替上面的抽象名称。但它仍然是丑陋的。