简体   繁体   中英

Using list comprehensions to make a funcion more pythonic

I'm doing some Google Python Class exercises and I'm trying to find a pythonic solution to the following problem.

D. Given a list of numbers, return a list where all adjacent == elements have been reduced to a single element, so [1, 2, 2, 3] returns [1, 2, 3]. You may create a new list or modify the passed in list.

My try, which is working perfectly is the following:

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

For example, with remove_adjacent([2, 2, 3, 3, 3]) the output is [2, 3] . Everything's ok.

I'm trying to use list comprehensions in order to archieve this in a more pythonic way, so my try is the following:

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

This, with the same input [2, 2, 3, 3, 3] , the output is [2, 2, 3, 3, 3] (the same). Meeeh! Wrong.

What I'm doing wrong with the list comprehensions? Am I trying to do something which is impossible to do with list comprehensions? I know it's a bit weird to initialize the list ( result = [] ), so maybe it's not posible to do it using list comprehensions in this case.

Am I trying to do something which is impossible to do with list comprehensions?

Yep. A list comprehension can't refer to itself by name, because the variable doesn't get bound at all until the comprehension is completely done evaluating. That's why you get a NameError if you don't have result = [] in your second code block.

If it's not cheating to use standard modules, consider using groupby to group together similar values in your list:

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

For the sake of learning, I'd suggest using core reduce function:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM