Устранение смежных номеров дилеммы

1

Я писал функцию для удаления соседних эквивалентных чисел в списке. Я написал remove_adjacent (nums) честно менее чем за минуту. Однако я, похоже, застрял в этой колею, где то, что я пишу, вообще не является питоническим. А также это не так быстро, как хотелось бы. Второе решение было предназначено для Google. Это документ для решения проблем с базовым кодом Google, над которым я работал, и забыл, где именно я его получил, но от разработки Google.

# 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.

def remove_adjacent(nums):

  index, index_1 = 0, 1
  while index_1 < len(nums):
      if nums[index] == nums[index_1]:
          nums = nums[:index] + nums[index+1:]
      else:
          index = index_1
          index_1 += 1 
  return nums

#Googles solution
def remove_adjacent2(nums):
    result = []
    for num in nums:
        if result == [] or num not in result:
            result.append(num)
    return result

Я чувствую, что моя проблема связана с моим предыдущим опытом с C и C++. Любые мысли о том, как улучшить? Мне просто нужна практика грубой силы? Непрерывные повторения "Я написал это так, но это скорее питон, чтобы написать его так"

  • 0
    Это просто смежные идентичные числа, которые должны быть сведены к одному экземпляру, или все идентичные числа? Например, [1, 2, 3, 1] разрешено?
  • 0
    Просто соседние номера
Показать ещё 6 комментариев
Теги:

2 ответа

2

Идеально itertools.groupby для itertools.groupby:

from itertools import groupby

lst = [1, 2, 2, 3]
print([next(x) for _, x in groupby(lst)])
# [1, 2, 3]
  • 1
    Так как вы используете стандартную функцию «идентичности» с groupby , вам не нужно возиться с вызовом next в группе, просто используйте ключ напрямую (вещь, которую вы в настоящее время назначаете _ ).
  • 1
    @ PM2Ring Правильно. Итак: [a for a, _ in groupby(lst)] .
2

Для этого есть рецепт itertools, он выглядит так:

def unique_justseen(iterable, key=None):
    "List unique elements, preserving order. Remember only the element just seen."
    # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
    # unique_justseen('ABBCcAD', str.lower) --> A B C A D
    return map(next, map(itemgetter(1), groupby(iterable, key)))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню