Удалить каждый второй элемент из списка

Рейтинг: 6Ответов: 5Опубликовано: 27.08.2023

Задача состоит в следующем:

Дан список строк. Нужно убрать из списка каждый второй элемент. Например:

['1', '2', '3', '4'] => ['2', '4']
['qwerty', 'asdfg', 'zxcvb'] => ['asdfg']

Я захотел написать однострочное решение данной задачи. Моя попытка:

return [i for i in spisok if spisok.index(i) % 2 == 0]

Код, естественно, не работает на списках, в которых присутствуют повторяющиеся значения, так как метод list.index() возвращает индекс первого вхождения в список. Конечно, легко решить задачу при помощи многострочного кода, вроде

i = 1
while index < len(spisok):
    del spisok[i]
    i += 1
return spisok

Но все-таки, существует ли однострочное решение данной задачи? Хотелось бы узнать

  • Самое лаконичное решение
  • Самое понятное решение
  • Самое запутанное решение (☻)

Ответы

▲ 6Принят
l=['1', '2', '3', '4']
def q2 (l):
    return l[1::2]

def qq2(l):
    return [l[i] for i in range(1,len(l),2) ]

def qqq2(l):
    return list(dict(filter(lambda pair: pair[0]%2 == 1, dict(zip(range(len(l)), l)).items())).values())

def r(l):
    return [] if not l else r(l[:-1]) + [l.pop()] if len(l) % 2 == 0 else r(l[:-1])

print(q2(l),qq2(l),qqq2(l),r(l))

Вывод

['2', '4'] ['2', '4'] ['2', '4'] ['2', '4']
▲ 5

Можно удалить каждый второй элемент:

arr = ['1', '2', '3', '4']


del arr[::2]
▲ 3

В копилку запутанных (и, заодно, неэффективных) решений :)

import pandas as pd
lst = ['1', '2', '3', '4']
print(pd.Series(lst)[pd.Series(lst).index.to_series().mod(2).eq(1)].to_list())
['2', '4']

И еще одно, надеюсь, достаточно запутанное:

out = [x for x, even in zip(lst, list(reversed(range(2))) * (len(lst) // 2)) if not even]
▲ 2

Добавлю в качестве варианта (хотя лучший вариант был дан в комментарии)

from itertools import compress, cycle


a = ['1', '2', '3', '4']
b = ['qwerty', 'asdfg', 'zxcvb']

print(
    list(compress(a, cycle((0, 1,))))
)
# ['2', '4']

print(
    list(compress(b, cycle((0, 1,))))
)
# ['asdfg']
▲ 1

Можно вот так:

return [e for i, e in enumerate(spisok, 1) if i % 2 == 0]