【问题标题】:Python - itertools.groupbyPython - itertools.groupby
【发布时间】:2021-03-14 23:54:22
【问题描述】:

只是遇到了 itertools.groupby 的问题。给定一个字典列表,

my_list = [
{'name': 'stock1', 'price': 200, 'shares': 100},
{'name': 'stock2', 'price': 1.2, 'shares': 1000},
{'name': 'stock3', 'price': 0.05, 'shares': 200000},
{'name': 'stock1', 'price': 200.2, 'shares': 50}]

我希望从这个列表中创建一个字典,其中键是股票的名称,值是该股票的字典列表,例如:

{'stock1': [{'name': 'stock1', 'price': 200, 'shares': 100}, {'name': 'stock1', 'price': 200.2, 'shares': 50}] }

我运行了这段代码:

by_name = { name: list(items) for name, items in itertools.groupby(
            my_list, key=lambda x: x['name'])}

,这是我得到的结果:

 {'stock1': [{'name': 'stock1', 'price': 200.2, 'shares': 50}],
 'stock2': [{'name': 'stock2', 'price': 1.2, 'shares': 1000}],
 'stock3': [{'name': 'stock3', 'price': 0.05, 'shares': 200000}]}

对于 stock1,我预计列表中有 2 个项目,但它只有原始 my_list 中的最新条目。谁能指出错误在哪里?谢谢!

【问题讨论】:

标签: python itertools


【解决方案1】:

itertools.groupby 不是这样工作的。来自手册:

每次键函数的值发生变化时,它都会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序的原因)

所以要实现你想要的分组类型,需要先对my_list进行排序:

import itertools

my_list = [
{'name': 'stock1', 'price': 200, 'shares': 100},
{'name': 'stock2', 'price': 1.2, 'shares': 1000},
{'name': 'stock3', 'price': 0.05, 'shares': 200000},
{'name': 'stock1', 'price': 200.2, 'shares': 50}
]

my_list.sort(key=lambda x:x['name'])

by_name = { name: list(items) for name, items in itertools.groupby(
            my_list, key=lambda x: x['name'])}

print(by_name)

输出

{'stock1': [{'name': 'stock1', 'price': 200, 'shares': 100},
            {'name': 'stock1', 'price': 200.2, 'shares': 50}],
 'stock2': [{'name': 'stock2', 'price': 1.2, 'shares': 1000}],
 'stock3': [{'name': 'stock3', 'price': 0.05, 'shares': 200000}]
}

【讨论】:

  • 我明白了。哇谢谢你。这是我的第一个问题,不到 5 分钟就得到了回答,直到现在我被困在这个问题上 1 小时!我最初认为我以前的代码很好,因为 itertools.groupby 会以任何方式生成迭代器并且不需要排序。再次感谢!
  • @johnseca48 不用担心 - 我很高兴能提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2021-09-17
  • 2023-03-19
  • 1970-01-01
  • 2010-09-05
相关资源
最近更新 更多