You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用itertools groupby从nltk.Freqdist生成的列表获取原索引?

保留原索引使用itertools.groupby分组的解决方案

这个问题我之前也碰到过——你直接用totalist传给groupby的话,分组的元素里没有保留原索引信息,自然拿不到原来的索引值。解决思路很简单:先把每个元素和它的原索引绑定在一起,再进行分组就可以了。

具体步骤

  1. 给原列表元素添加索引:用enumerate()函数把totalist里的每个子列表和它的索引打包成元组,生成一个带索引的新列表。
  2. 基于带索引的列表分组:修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:46:19