如何生成预先解压缩的列表?

时间:2010-08-29 04:06:33

标签: python group-by yield itertools iterable-unpacking

我有一个在itertools.groupby操作中创建的列表:

def yield_unpacked_list():
    for key, grp in itertools.groupby(something_to_groupby, key=lambda x: x[0]):
        subset_of_grp = list(item[2] for item in list(grp))
        yield key, subset_of_grp

例如,subset_of_grp原来是[1, 2, 3, 4][5, 6, 7, 8]

for m in yield_unpacked_list():
    print m

会打印出来:

('first_key', [1, 2, 3, 4])
('second_key', [5, 6, 7, 8])

现在,回到我的函数定义。显然以下是语法错误(*运算符):

def yield_unpacked_list():
    for key, grp in itertools.groupby(something_to_groupby, key=lambda x: x[0]):
        subset_of_grp = list(item[2] for item in list(grp))
        yield key, *subset_of_grp

我希望相同 print循环的以下结果不带[list]括号:

('first_key', 1, 2, 3, 4)
('second_key', 5, 6, 7, 8)

请注意,print仅用于说明目的。我还有其他功能可以从简化的tuple结构中受益。

2 个答案:

答案 0 :(得分:5)

yield (key,) + tuple(subset_of_grp)

答案 1 :(得分:2)

def yield_unpacked_list():
    for key, grp in itertools.groupby(something_to_groupby, key=lambda x: x[0]):
        yield (key,) + tuple(item[2] for item in grp)

从您想要打印的结果中,很明显您想要产生tuple - 不知道为什么将其称为“解压缩列表”,但无论如何,您就是这样。我还删除了对list的几个电话,这些电话在您的代码中完全没有任何有用的作用。