使用list comprehension,tuples和itertools.groupby

时间:2017-04-09 10:11:08

标签: 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的新手,即使用尽所有关键词后我都能想到我仍然无法在网上找到类似的问题。我确信它很简单,我看不到它。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

如果你想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]

答案 1 :(得分:1)

你可以试试这个

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]

答案 2 :(得分:0)

问题是group变量是一个只能迭代一次的迭代器。用完后看上去很空。您需要临时存储中间组。一种方法是使用嵌套生成器/ comprehesions,如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)]