Я писал функцию для удаления соседних эквивалентных чисел в списке. Я написал 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++. Любые мысли о том, как улучшить? Мне просто нужна практика грубой силы? Непрерывные повторения "Я написал это так, но это скорее питон, чтобы написать его так"
Идеально itertools.groupby
для itertools.groupby
:
from itertools import groupby
lst = [1, 2, 2, 3]
print([next(x) for _, x in groupby(lst)])
# [1, 2, 3]
groupby
, вам не нужно возиться с вызовом next
в группе, просто используйте ключ напрямую (вещь, которую вы в настоящее время назначаете _
).
[a for a, _ in groupby(lst)]
.
Для этого есть рецепт 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)))
[1, 2, 3, 1]
разрешено?