【问题标题】:Fetching and evaluating data from several dictionaries using filter,reduce,add,map使用 filter、reduce、add、map 从多个字典中获取和评估数据
【发布时间】:2013-12-02 09:39:30
【问题描述】:

使用 filter、reduce、add、map 从多个字典中获取和评估数据
我想计算以下内容:

  1. 过滤每个类别,取键的值 (t1,t2,t3..)
  2. 取出'a','b'的值。
  3. 从插件添加到同一类别中的每个值
  4. 每个相乘

    结果 = ((80+5)*2.5 + (95+5)*4 + (75+3)*3.5 + (58+10)*5)


要处理的数据:

Values = {'b': 95, 'c': 75, 'a': 80, 'd': 58}
Multipliers = {'b': 4, 'c': 3.5, 'a': 2.5, 'd': 5}
Addons = {'t1':5, 't2':3, 't3':10} 
Category = {'t1':('a', 'b'), 't2':('c',), 't3':('d',)}

到目前为止,我所做的是过滤与插件对应的每个类别,现在我只能打印它:

reduce(add,map(lambda x,y: x[1],filter(lambda t: t[0] in Addons, Category.items())))


有什么建议么?谢谢。

【问题讨论】:

  • 作为一个简短的评论...仅仅因为您可以在一行上做所有事情,并不意味着您应该。跨度>
  • 我的回答显示了如何按照自己的方式进行操作,但它比建议的其他方法复杂得多。

标签: python dictionary filtering


【解决方案1】:
sum((Values[v] + Addons[c]) * Multipliers[v] 
         for c, vs in Category.items() 
              for v in vs if c in Addons)
# 1225.5

【讨论】:

  • 在这种情况下可以选择使用过滤器吗?
  • @OfirAttia 我不完全明白你想如何过滤,无论是从文本还是从测试用例,你能澄清一下应该过滤掉什么
  • 好答案,这就是我 +1 的原因,但在这种情况下,filter 所做的是返回元组,使得Category 中的键也在Addons 中。因此,如果这不是真的,这将崩溃。我会选择你的答案,因为它很简单,但如果你想看看他的逻辑的有效实现,请查看我的答案。
  • @SteveP。在这个总和中添加if 语句很容易,但我不确定是哪一个。
【解决方案2】:

你有:

reduce(add,map(lambda x,y: x[1],filter(lambda t: t[0] in Addons, Category.items())))

Category.items()(key, value) 对作为元组返回。

filter(lambda t: t[0] in Addons, Category.items()) 将返回其键也是 Addons 中键的所有元组

然而在map() 中,你的lamda 函数有两个参数,但你只给出元组,所以应该是map(lambda x: x[1]...),它将返回来自Category 的所有values,其键也在Addons

接下来,reduce 会将所有密钥添加到一起。这是按照您的方式进行操作的正确实现,但我会接受已接受的答案,因为它直观且简单:

reduce(add, 
       reduce(add, 
       map(lambda x: [Multipliers[val]*(Values[val] + Addons[x[0]]) for val in x[1]],
       filter(lambda x: x[0] in Addons, Category.items()))))

唯一的例外是如果Categories 中的所有键都不是Addons 中,那么接受的答案将不起作用(我用修复编辑了他的答案),但这会。

【讨论】:

  • @OfirAttia 没问题。
【解决方案3】:
  1. vars 大写不是一个好习惯,建议使用PEP-8

  2. 我认为你应该简单地解决它,而不是一行。

这是我的简单解决方案:

values = {'b': 95, 'c': 75, 'a': 80, 'd': 58}
multipliers = {'b': 4, 'c': 3.5, 'a': 2.5, 'd': 5}
addons = {'t1':5, 't2':3, 't3':10}
category = {'t1':('a', 'b'), 't2':('c',), 't3':('d',)}

outputString = ""

for value in category:
    for item in list(category[value]):
        if value in addons and item in values and item in multipliers:
            addonStr = "({} + {})*{}".format(values[item], addons[value], multipliers[item])
            outputString += addonStr

outputString = "(" + outputString + ")"

print outputString

输出:

((75 + 3)*3.5(58 + 10)*5(80 + 5)*2.5(95 + 5)*4)

您可以添加和else 语句,这样如果您的字典中有错误,您就可以跟踪它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2012-02-22
    • 2020-02-15
    • 2019-03-26
    相关资源
    最近更新 更多