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

Python 使用列表理解、元组和itertools.groupby,python,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,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,4,5,5,6]

我得到的结果是:

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


插入的元组显然是空的,但同时它们不是空的,因为它们必须包含多个元素才能首先插入。发生什么事?我是python新手,即使用尽了我能想到的所有关键字,我仍然无法在网上找到类似的问题。我肯定这是件简单的事,但我就是看不见。感谢您的帮助。

如果您想做
列表理解

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

问题是组变量是一个迭代器,只能迭代一次。筋疲力尽后,它显得空荡荡的。您需要临时存储中间组。一种方法是按照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)]
输出:

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

我不知道OP是否希望它们按顺序排列,但在大多数情况下,您的答案不会按顺序返回数字(仅针对小数字),(除了时间复杂度非最佳外)。谢谢Tamas!我已经接受了你的回答,因为你提供了一个解释,我的问题就解决了。