使用列表理解、元组和itertools.groupby

2024-04-27 04:05:17 发布

您现在位置:Python中文网/ 问答频道 /正文

这给我带来了一段时间的麻烦,也许我的视野被挖了。给定一个整数列表,生成一个新列表,其中每个相邻的重复项组都已转换为一个元组。

例如,给定列表:[1, 2, 3, 3, 4, 5, 5, 5, 6]

生成的列表包含:[1, 2, (3, 3), 4, (5, 5, 5), 6]

我想用列表理解来实现这一点。

numbers = [1, 2, 3, 3, 4, 5, 5, 5, 6]

it = itertools.groupby(numbers)
numbers = [tuple(group) if len(tuple(group)) > 1 else key for key, group in it]

我期待的结果是:

[1, 2, (3, 3), 4, (5, 5, 5), 6]

我得到的结果是:

[1, 2, (), 4, (), 6]

显然,插入的元组是空的,但同时它们不是空的,因为它们本来必须有多个元素才能被插入。发生什么事?我是python新手,即使用尽了我能想到的所有关键字,我还是没能在网上找到类似的问题。我肯定是简单的东西,我只是看不见。感谢任何帮助。


Tags: key列表lenifgroupit整数else
3条回答

问题是group变量是一个只能迭代一次的迭代器。筋疲力尽之后,它看起来是空的。您需要临时存储中间组。一种方法是按照itzmeontv的建议使用嵌套生成器/压缩,或者使用映射函数:

def make_group(group):
  group = tuple(group)
  if len(group) == 1:
    return group[0]
  return group

numbers = [make_group(group) for key, group in itertools.group_by(numbers)]

你可以试试这个

a = [1, 2, 3, 3, 4, 5, 5, 5, 6]
[(i,)*a.count(i) if a.count(i)>1 else i for i in set(a)]

输出:

^{pr2}$

如果您想list comprehension

>>>l = [1, 2, 3, 3, 4, 5, 5, 5, 6]
>>>[k[0] if len(k) == 1 else tuple(k) for k in [list(j) for i,j in itertools.groupby(l)]]
[1, 2, (3, 3), 4, (5, 5, 5), 6]

相关问题 更多 >