Разделить список пополам четными и нечетными элементами?
Возможный дубликат:
Программа Python для разбиения списка на два списка с чередующимися элементами
У меня есть список вроде этого:
list1 = [blah, 3, haha, 2, pointer, 1, poop, fire]
Выход, который я хочу:
list = [3, 2, 1, fire]
Итак, я хочу составить список четных элементов из прежнего списка. Я попытался использовать инструкцию for
и попытался удалить 2-й элемент, добавив их в список, но это не сработало:
count = 0
for a in list1:
list2.append(a)
if count % 2 = = 1:
list2.pop(count)
print list2
Любые предложения?
Ответы
Ответ 1
Это должно дать вам то, что вам нужно - выборка списка через регулярные интервалы со смещения 0 или 1:
>>> a = ['blah', 3,'haha', 2, 'pointer', 1, 'poop', 'fire']
>>> a[0:][::2] # even
['blah', 'haha', 'pointer', 'poop']
>>> a[1:][::2] # odd
[3, 2, 1, 'fire']
Обратите внимание, что в приведенных выше примерах первая операция среза (a[1:]
) демонстрирует выбор всех элементов из желаемого начального индекса, тогда как операция второго среза (a[::2]
) демонстрирует, как выбирать каждый другой элемент в списке.
Более идиоматическая и эффективная операция сложения объединяет два в один, а именно a[::2]
(0
можно опустить) и a[1::2]
, что позволяет избежать ненужной копии списка и должно использоваться в производственном коде, так как другие отметили в комментариях.
Ответ 2
Вы можете использовать сортировку списка. Следующий фрагмент будет делать.
list1 = ['blah', 3, 'haha', 2, 'pointer', 1, 'poop', 'fire']
listOdd = list1[1::2] # Elements from list1 starting from 1 iterating by 2
listEven = list1[::2] # Elements from list1 starting from 0 iterating by 2
print listOdd
print listEven
Выход
[3, 2, 1, 'fire']
['blah', 'haha', 'pointer', 'poop']
Ответ 3
Вы можете просто нарезать список:
Для нечетных: a[1::2]
Для четного: a[::2]