我正在尝试以更模块化/可重用的方式编写这段python代码,而我却无法编写它
考虑一下:
lst = get_list_of_objects()
dic = {}
for item in lst:
if item.attribute == 'foo':
dic[item.name] = [func(x) for x in item.attribute2]
elif item.attribute == 'bar':
dic[item.name] = []
else:
dic[item.name] = [func2(x) for x in item.attribute3]
我尝试将其设为“功能性”:
fooItems = reduce(lambda dic, item: dic.update(item.name, map(func, item.attribute2)),
filter(lambda i: i.attribute == 'foo', lst),
{})
barItems = reduce(lambda dic, item: dic.update(item.name, []),
filter(lambda i: i.attribute == 'bar', lst),
fooItems)
dic = reduce(lambda dic, item: dic.update(item.name, map(func2, item.attribute3)),
filter(lambda i: i.attribute != ('bar' or 'foo'), lst),
barItems)
我真的不太喜欢这个解决方案。
我想要的是一个分成3条路径的流,每条路径被映射,然后它们合并回同一个流并变成一个字典(我希望这句话有意义)
请分享您对此的看法......
答案 0 :(得分:0)
你可以拥有一个只选择值进入字典的函数,而不是修改字典:
def value(item):
if item.attribute == 'foo':
return [func(x) for x in item.attribute2]
elif item.attribute == 'bar':
return []
else:
return [func2(x) for x in item.attribute3]
然后你可以声明性地创建字典:
items = get_items()
dic = {item.name: value(item)
for item in items}