【问题标题】:Python list comprehension not working for itertools.groupby decodingPython 列表理解不适用于 itertools.groupby 解码
【发布时间】:2017-04-17 16:01:23
【问题描述】:

我正在尝试将itertools.groupby 的结果解码为值列表。

我的来源是:

x = [(1, 2), (2, 1), (6, 3), (6, 5), (1, 3)]

虽然最初的方法是使用这样的 for 语句来实现:

keyfunc = itemgetter(0)
groups = []
uniquekeys = []
data = sorted(x, key=keyfunc)
for k, g in itertools.groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

我选择使用列表推导将其放在一行中:

[(k, list(g)) for k, g in list(itertools.groupby(x, keyfunc))]

第一种方法的结果是:

[1, 2, 6] #for uniquekeys
[[(1, 2), (1, 3)], [(2, 1)], [(6, 3), (6, 5)]] #for groups

这完全有道理。

第二种方法的结果是:

[(1, []), (2, []), (6, [(6, 5)])]

我们可以看到这些组要么是空的,要么是单个整数。

哪里出错了?

【问题讨论】:

  • 只要使用[(k, list(g)) for k, g in itertools.groupby(x, keyfunc)]
  • @ThierryLathuille 为什么会有所作为?
  • 我会尽快写解释的……
  • 这是因为您在 groupby 迭代器上调用 list,这会耗尽它。调用 list 然后 iteratorthen 迭代它会破坏整个目的......你为什么认为它是必要的?
  • 文档中其实有提到:"返回的组本身就是一个迭代器,它和groupby()共享底层的iterable。因为源是共享的,所以当groupby()对象被推进,之前的组不再可见。”

标签: python group-by list-comprehension itertools


【解决方案1】:

问题在于list(itertools.groupby(x, keyfunc)) 中的列表。只需放下它,它应该可以工作。

list(itertools... 在您的示例中有四个迭代器,它们都共享相同的底层迭代器。通过构建列表,您有效地用尽了前三个迭代器来创建第四个迭代器,从而使整个事物无法使用。通过删除显式列表,您可以从一个迭代器跳到另一个迭代器。

【讨论】:

  • 谢谢,就是这样。
猜你喜欢
  • 2023-01-01
  • 2019-12-18
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多