【问题标题】:Grouping the same recurring items that occur in a row from list对列表中连续出现的相同重复项目进行分组
【发布时间】:2012-11-13 22:52:53
【问题描述】:

例如,我们有一个这样的列表:

L = ["item1", "item2", "item3", "item3", "item3", "item1", "item2", "item4", "item4", "item4"]

我想将它们打包成以下形式的元组列表:

[("item1", 1), ("item2", 1), ("item3", 3),... ("item1", 1)]

我已经开发了一个类似的算法,得到:

{item1: 2, item2: 2, ...}

(它会找到所有出现并计算它们,即使它们不是邻居......)

但是,我希望它只将具有相同 的那些项目分组为邻居(即一起连续出现),我该如何做到这一点?

并不是我不知道该怎么做,而是我倾向于编写很长的代码,并且在这种情况下我想要一个优雅而简单的解决方案。

【问题讨论】:

  • item1: 1, item2:1, item3:3....item1: 1 不会是字典...(它有多个相同的键)
  • 很抱歉。那是真实的。忽略我写的必须是字典的事实。这不是一个要求。它可以是元组的形式。所以顺序当然很重要。

标签: python list grouping recurring


【解决方案1】:

这也是使用itertools.groupby(生成器版本):

from itertools import groupby
counts = ((k, sum(1 for _ in g)) for k, g in groupby(l))
>>> list(counts)
[('item1', 1),
 ('item2', 1),
 ('item3', 3),
 ('item1', 1),
 ('item2', 1),
 ('item4', 3)]

【讨论】:

  • len(list(g))sum(1 for _ in g) 短,反正 +1。
  • @AshwiniChaudhary 它更短,但我认为它可以更快;我倾向于认为避免创建一个列表只是为了计算它的元素是个好主意。感谢您的支持:)
  • 好点,正好给他们计时,sum(1 for _ in g)len(tuple(g))len(list(g)),今天学到了一些新东西。 :)
【解决方案2】:

使用itertools.groupby(),项目会重复,因此您可能无法将所有值存储在字典中,因为item1item2 会重复:

In [21]: l = ["item1", "item2", "item3", "item3", "item3", "item1", "item2", "item4", "item4", "item4"]

In [22]: for k,g in groupby(l):
    print "{0}:{1}".format(k,len(list(g)))
   ....:     
item1:1
item2:1
item3:3
item1:1
item2:1
item4:3

【讨论】:

  • 这种情况下不需要按键功能。
  • 太棒了。谢谢。我确实在寻找 groupby 功能。是的,它对关键的 lambda 函数没有用。它绝对完美无瑕:)
  • 你也可以使用funcy库中的ilen而不是len(list(...))来提高速度。
【解决方案3】:
python 3.2
from itertools import groupby

>>> [(i,(list(v)).count(i)) for i,v in groupby(L)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-02-23
    • 1970-01-01
    • 2020-08-14
    • 2020-05-03
    • 2018-08-08
    相关资源
    最近更新 更多