如何用itertools groupby从nltk.Freqdist生成的列表获取原索引?
保留原索引使用itertools.groupby分组的解决方案
这个问题我之前也碰到过——你直接用totalist传给groupby的话,分组的元素里没有保留原索引信息,自然拿不到原来的索引值。解决思路很简单:先把每个元素和它的原索引绑定在一起,再进行分组就可以了。
具体步骤
- 给原列表元素添加索引:用
enumerate()函数把totalist里的每个子列表和它的索引打包成元组,生成一个带索引的新列表。 - 基于带索引的列表分组:修改
groupby的分组键函数,让它基于带索引元素里的原内容(也就是子列表)来分组,这样遍历组的时候就能同时拿到原索引和原内容了。
完整代码示例
from itertools import groupby # 你的原始数据 totalist = [ [('A',12),('C',1)], # 索引0 [('A',25),('X',3)], # 索引1 [('Z',3),('T',2)], # 索引2 [('Z',10),('M',8)], # 索引3 [('Z',8),('M',8)], # 索引4 [('C',10),('M',8)] # 索引5 ] # 给每个子列表绑定原索引,生成(原索引, 子列表)的元组列表 indexed_totalist = list(enumerate(totalist)) # 按每个子列表的第一个元组的首字符分组 for key, group in groupby(indexed_totalist, lambda x: x[1][0][0]): print(f"分组键: {key}") for item in group: original_index = item[0] original_content = item[1] print(f"原索引: {original_index}, 对应内容: {original_content}") print("---")
重要注意事项
itertools.groupby只会把连续的相同键元素分到同一个组里。如果你的原始列表中,相同分组键的子列表不是连续的(比如索引0是'A',索引3又出现'A'),那么分组后会得到两个独立的'A'组。
如果需要把所有相同键的元素都分到同一组,要先对带索引的列表按分组键排序,再进行分组:
# 先按分组键排序,再分组 sorted_indexed = sorted(indexed_totalist, key=lambda x: x[1][0][0]) for key, group in groupby(sorted_indexed, lambda x: x[1][0][0]): print(f"分组键: {key}") for item in group: original_index = item[0] original_content = item[1] print(f"原索引: {original_index}, 对应内容: {original_content}") print("---")
内容的提问来源于stack exchange,提问作者Rikudo Pain
相关产品推荐
相关产品推荐

