【问题标题】:How to iterate a dictionary based on another dictionary in python?如何根据python中的另一个字典迭代一个字典?
【发布时间】:2021-02-02 06:47:14
【问题描述】:

我有一本包含一周饮食信息的字典,我们需要根据输出元数据计算客户食用不同类别食物的天数。输出元数据将食物类别作为键,将饮食中的食物作为值。 1, 0 的值是布尔指标,分别表示客户是否吃饭。

这里的顾客在星期四吃了鸡肉和羊肉,但在求和时,我们只想计算一天的“肉”。元数据中的类别分组将来可能会发生变化,例如如果顾客吃鱼。

你能帮我解决这个问题吗?

diet = {'chicken' : [1, 0, 0, 1, 0, 1, 0],
        'lamb'    : [0, 0, 1, 1, 0, 1, 1],
        'salad'   : [0, 0, 1, 0, 1, 1, 1]}

output_metadata = {'Meat'    : ['chicken', 'lamb'],
                   'Veggies' : ['salad'],
                   'Overall' : ['chicken', 'lamb', 'salad']}

想要的输出是

{'Meat': 5, 'Veggies': 4, 'Overall': 6}

【问题讨论】:

  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 好像你只需要一些嵌套循环。
  • 数字1和0分别代表什么?如果只是当天有没有吃,最好用TrueFalse。使用数字会使它们看起来像是数量。
  • @Barmar,我已经更新了这个问题。更新真/假看起来很长,所以我没有。谢谢!
  • {k: sum(map(any, zip(*(Diet[f] for f in v)))) for k, v in output_metadata.items()}}

标签: python algorithm dictionary data-structures


【解决方案1】:

如果您希望在不同的日子检查任何选定类别的非零值,您可以将选定的数组压缩在一起。例如:

def days(diet, categories):
    it = zip(*(diet[c] for c in categories))
    return sum(any(x) for x in it)

现在你可以构建输出字典了:

output = {k: days(Diet, v) for k, v in output_metadata.items()}

作为一个单行者(实际上不要这样做):

output = {k: sum(any(x) for x in zip(*(Diet[c] for c in v))) for k, v in output_metadata.items()}

但实际上,您拥有的是伪装的数据框。考虑使用 pandas 库来做类似的事情。您将能够单独选择日期和/或类别,并总结您想要的任何统计数据。

【讨论】:

  • 谢谢!但是这个解决方案给出了他吃食物类别的次数,但我们需要以独特的方式天数..假设他在同一天吃了羊肉和鸡肉,应该算作一次。
  • @vamos3556。我完全重写了答案
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 2015-09-28
  • 2019-05-08
  • 2018-04-30
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多