使用列表推导使函数更加pythonic

Avi*_*ión 2 python list-comprehension python-2.7

我正在做一些谷歌Python类练习,我正在尝试找到以下问题的pythonic解决方案.

D.给定一个数字列表,返回一个列表,其中所有相邻的==元素已减少为单个元素,因此[1,2,3,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
Run Code Online (Sandbox Code Playgroud)

例如,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
Run Code Online (Sandbox Code Playgroud)

使用相同的输入[2, 2, 3, 3, 3],输出[2, 2, 3, 3, 3](相同).Meeeh!错误.

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

Kev*_*vin 11

我是否尝试做一些与列表推导无关的事情?

是的.列表推导不能通过名称引用自身,因为在完全完成求值评估之前,变量根本不受约束.这就是为什么你得到一个,NameError如果你没有result = []在你的第二个代码块.

如果不使用标准模块作弊,请考虑使用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]
Run Code Online (Sandbox Code Playgroud)