Groupby Itertools使用相同的密钥给不同的组

时间:2018-10-02 08:20:37

标签: python split group-by itertools

我将列表中的字符串元素按字符串中的第一个单词和最后一个单词分组。我正在使用groupby中的itertools进行分组。对于最后一个单词,该过程似乎运行良好,但是对于第一个单词,似乎并没有做到这一点。

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))

以上输出

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

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

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

它似乎不起作用

MAD ['MAD model meFuelFlowStar']
MedAD ['MedAD model meFuelFlowStar']
MAD ['MAD model rpmStar']
MedAD ['MedAD model rpmStar']

这让我感到惊讶,因为键是相同的

1 个答案:

答案 0 :(得分:0)

groupby假定同一组中的元素连续出现(即,基本上是对列表进行排序)。在groupby's documentation的开头,它说:

  

制作一个迭代器,该迭代器从中返回个连续的键和组   。键是为每个键计算键值的函数   元件。如果未指定或为None,则密钥默认为身份   函数并返回不变的元素。 通常,可迭代   需要已经在相同的键功能上进行了排序。

您的列表未排序。因此,请在groupby之前对其进行排序。定义sortedgroupby使用的键功能:

def first_word(sentence):
    return sentence.split()[0]

然后:

groupby(sorted(meFuelFlowStar, key=first_word), key=first_word)