Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用列表理解使函数更具python风格_Python_Python 2.7_List Comprehension - Fatal编程技术网

使用列表理解使函数更具python风格

使用列表理解使函数更具python风格,python,python-2.7,list-comprehension,Python,Python 2.7,List Comprehension,我正在做一些练习,我正试图找到一个解决以下问题的办法 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)

我正在做一些练习,我正试图找到一个解决以下问题的办法

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
def remove_adjacent(nums):  
  result = []
  result = [num for num in nums if (len(result)==0 or num!=result[-1])]
  return result
例如,使用
remove_innect([2,2,3,3,3])
时,输出为
[2,3]
。一切都好

我尝试使用列表理解,以便以一种更为通俗的方式来构建它,因此我的尝试如下:

def remove_adjacent(nums):
  result = []
  for num in nums:
    if len(result) == 0 or num != result[-1]:
      result.append(num)
  return result
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]
,输出是
[2,2,3,3,3]
(相同)。Meeeh!错

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

我是否在尝试做一些列表理解无法做到的事情

是的。列表理解不能通过名称来引用自身,因为在理解完成之前,变量根本不会被绑定。这就是为什么在第二个代码块中没有
result=[]
时会出现
namererror

如果使用标准模块不是作弊,请考虑使用<代码> GROPPB/<代码>将列表中的相似值分组:

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

为了便于学习,我建议使用core
reduce
函数:

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

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