Python itertools groupby 在列表理解中的多次使用

Posted

技术标签:

【中文标题】Python itertools groupby 在列表理解中的多次使用【英文标题】:Python itertools groupby multiple use in list comprehension 【发布时间】:2018-05-04 10:08:32 【问题描述】:

我正在尝试做类似的事情:

groups = groupby(all_data, key=itemgetter(1))
result = []
for k,g in groups:
    gg = list(g)
    count = len(gg)
    v = gg[0][3:] #No empty groups, right?
    hosts = ";".join([x[0] for x in gg])
    result.append(v + (count,) + (hosts,))

我讨厌循环。 ;) 有没有机会通过理解来做到这一点?问题是 g 是迭代器,而不是列表,我不知道如何将其转换为理解列表。

【问题讨论】:

也许您正在寻找类似 @​​987654322@ 的东西,但是如果您提供您的输入和预期的输出会更好。 这是太多的代码,无法放入列表理解中。为什么您曾经会尝试将 8(!) 行代码转换为单行代码?如果您想要一种更好的 方式来编写此循环,请寻求一种更好的方式来编写此循环。不要要求列表理解,因为这是编写此循环的更糟糕的方式。 【参考方案1】:

将其转换为列表理解没有必要或显着的好处。你可能会留下只有你能理解的不可读的代码。

我支持的一个风格点是不要过早或不必要地创建列表。这样就可以选择迭代结果,而不是构建一个包含所有结果的列表。

例如:

from itertools import groupby
from operator import itemgetter

all_data = [('A', 'B', 'C', 'S', 'T'),
            ('E', 'B', 'C', 'U', 'V'),
            ('H', 'I', 'J', 'W', 'X')]

groups = groupby(all_data, key=itemgetter(1))

def fun(groups):
    for _, g in groups:
        gg = list(g)
        hosts = ';'.join(list(map(itemgetter(0), gg)))
        yield gg[0][3:] + (len(gg),) + (hosts,)

res = list(fun(groups))

[('S', 'T', 2, 'A;E'),
 ('W', 'X', 1, 'H')]

【讨论】:

以上是关于Python itertools groupby 在列表理解中的多次使用的主要内容,如果未能解决你的问题,请参考以下文章

Python中的字典分组函数(groupby,itertools)

python3:set 和 itertools.groupby 产生不同的结果? [复制]

Python itertools groupby 在列表理解中的多次使用

python itertools groupby 返回元组

python itertools

如何使用 python itertools.groupby() 按字符串的第一个字符对字符串列表进行分组?