Python 如何基于连续属性值对对象(元组)进行分组?
我在这里发现了一个类似的问题: 它讨论了按相似属性对元组列表进行分组。我有一个物品清单;这些对象有一个“day”属性,我想根据这些对象是否具有连续的“day”值对它们进行分组。 e、 g 输出:Python 如何基于连续属性值对对象(元组)进行分组?,python,python-3.x,grouping,Python,Python 3.x,Grouping,我在这里发现了一个类似的问题: 它讨论了按相似属性对元组列表进行分组。我有一个物品清单;这些对象有一个“day”属性,我想根据这些对象是否具有连续的“day”值对它们进行分组。 e、 g 输出: [[('a',12),('b',13)],[('c',15),('d',16),('e',17)]] 您可以执行以下操作: from itertools import groupby, count from operator import itemgetter data = [('a', 12),
[[('a',12),('b',13)],[('c',15),('d',16),('e',17)]]
您可以执行以下操作:
from itertools import groupby, count
from operator import itemgetter
data = [('a', 12), ('b', 13), ('c', 15), ('c', 16), ('c', 17)]
def key(i, cursor=count(0)):
"""Generate the same key for consecutive numbers"""
return i[1] - next(cursor)
ordered = sorted(data, key=itemgetter(1))
result = [list(group) for _, group in groupby(ordered, key=key)]
print(result)
输出
[[('a', 12), ('b', 13)], [('c', 15), ('c', 16), ('c', 17)]]
以上内容基于Python 2.6文档中的一个旧示例
为了更好地说明发生了什么,请参见以下示例:
lst = [12, 13, 15, 16, 17]
print([v - i for i, v in enumerate(lst)])
生成的密钥是:
[12, 12, 13, 13, 13]
如图所示,连续跑步的关键点相同。谢谢您的回答。当我将其应用于代码时,它抛出以下错误:TypeError:“NameOfObject”对象不支持indexingHi,这一定是因为NameOfObject不是元组,如您的示例所示。使用attrgetter代替itemgetter
[12, 12, 13, 13, 13]