【问题标题】:Using list comprehensions to make a funcion more pythonic使用列表推导使函数更 Pythonic
【发布时间】:2025-12-17 13:40:01
【问题描述】:

我正在做一些Google Python Class 练习,我正在尝试为以下问题找到pythonic 解决方案。

D.给定一个数字列表,返回一个列表,其中所有相邻的 == 元素已简化为单个元素,因此 [1, 2, 2, 3] 返回 [1, 2, 3]。您可以创建一个新列表或修改传入的 列表。

我的尝试,完美的工作如下:

def remove_adjacent(nums):
  result = []
  for num in nums:
    if len(result) == 0 or num != result[-1]:
      result.append(num)
  return result

例如,remove_adjacent([2, 2, 3, 3, 3]) 的输出是[2, 3]。一切正常。

我正在尝试使用列表推导以便以更 pythonic 的方式对其进行归档,所以我的尝试如下:

def remove_adjacent(nums):  
  result = []
  result = [num for num in nums if (len(result)==0 or num!=result[-1])]
  return result

这个,同样的输入[2, 2, 3, 3, 3],输出是[2, 2, 3, 3, 3](同样)。呸!错了。

我对列表推导做错了什么?我是否正在尝试做一些列表推导无法做到的事情?我知道初始化列表 (result = []) 有点奇怪,所以在这种情况下使用列表推导可能不太可能。

【问题讨论】:

  • 仅供参考,list(set([2, 2, 3, 3, 3])) 将返回 [2, 3]。但是,这只会将列表缩减为一组唯一的值。它不一定会删除相邻的重复项。
  • 你从哪里得到res 变量
  • 另外,res 应该是 result
  • @VigneshKalai 这是result,而不是res。我的错误是复制代码。
  • @Borja 那么你将得到相同的数字,因为 len(result) 将等于 0 直到列表理解结束

标签: python python-2.7 list-comprehension


【解决方案1】:

我是否正在尝试做一些列表推导无法做到的事情?

是的。列表推导不能通过名称引用自身,因为在推导完全完成评估之前,变量根本不会被绑定。这就是为什么您在第二个代码块中没有 result = [] 时会得到 NameError 的原因。

如果使用标准模块不是作弊,请考虑使用groupby 将列表中的相似值组合在一起:

>>> import itertools
>>> seq = [1, 2, 2, 3]
>>> [k for k,v in itertools.groupby(seq)]
[1, 2, 3]
>>> seq = [2,2,3,3,3]
>>> [k for k,v in itertools.groupby(seq)]
[2, 3]

【讨论】:

    【解决方案2】:

    为了学习,我建议使用核心reduce函数:

    def remove_adjacent(lst):
        return reduce(lambda x, y: x+[y] if not x or x[-1] != y else x, lst, [])
    

    【讨论】: