Groupby itertools 为不同的组提供相同的密钥

clo*_*las 0 python split group-by python-itertools

我按字符串中的第一个单词和最后一个单词对列表中的字符串元素进行分组。我正在使用groupbyfromitertools进行分组。该过程似乎对最后一个单词运行良好,但对第一个单词似乎效果不佳。

from itertools import groupby

model_eval_cols = ['MAD model meFuelFlowStar', 'MedAD model meFuelFlowStar', 'MAD model rpmStar', 'MedAD model rpmStar']

for k, v in groupby(model_eval_cols, key=lambda x: x.split(' ')[2]):
    print(k, list(v))
Run Code Online (Sandbox Code Playgroud)

以上输出

meFuelFlowStar ['MAD model meFuelFlowStar', 'MedAD model meFuelFlowStar']
rpmStar ['MAD model rpmStar', 'MedAD model rpmStar']
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将字符串按第一个单词分组:

for k, v in groupby(model_eval_cols, key=lambda x: x.split(' ')[0]):
    print(k, list(v))
Run Code Online (Sandbox Code Playgroud)

似乎不起作用

MAD ['MAD model meFuelFlowStar']
MedAD ['MedAD model meFuelFlowStar']
MAD ['MAD model rpmStar']
MedAD ['MedAD model rpmStar']
Run Code Online (Sandbox Code Playgroud)

这让我很惊讶,因为按键是相同的

Gia*_*tta 5

groupby假设同一组中的元素连续出现(即基本上列表是排序的)。groupby在的文档开头它说:

创建一个迭代器,从可迭代对象中返回连续的键和组。键是计算每个元素的键值的函数。如果未指定或为 None,则 key 默认为恒等函数并返回未更改的元素。一般来说,可迭代对象需要已经在相同的键函数上进行排序。

您的列表未排序。所以先排序一下groupbysorted定义和所使用的关键函数groupby

def first_word(sentence):
    return sentence.split()[0]
Run Code Online (Sandbox Code Playgroud)

进而:

groupby(sorted(meFuelFlowStar, key=first_word), key=first_word)
Run Code Online (Sandbox Code Playgroud)