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!我已经接受了你的回答,因为你提供了一个解释,我的问题就解决了。