2013-11-30 4 views
0

Я использую python 3.3 Я пытаюсь написать эту строку в одной строке, и я не могу справиться.пытается написать цикл в одной строке

plop = [] 
    for i in range (len(list1)): 
     if list1[i] != list1[i-1]: 
      plop.append(list1[i]) 

Я не забочусь перезапись list1 при необходимости, а не с помощью «плюх» вообще, я не хочу использовать множество, как хорошо. Спасибо!

p.s отредактирован была опечатка, извините

+0

Как указано в @JonClements, ваш код сравнивает 'list1 [0]' с 'list1 [-1]' на первом шаге, и поэтому '[1,2,1]' будет производить '[new_ls [1], new_ls [2]] '. Это предназначено, или это ошибка? – DSM

ответ

3

Гораздо более удобные для чтения (и не очень склонны к ошибкам индекса - если вы не предназначены для сравнения первого элемента с последним, а второй с первым и т.дом ...) способом удаления последовательных дубликатов является если вы только что сделали:

from itertools import groupby 
plop = [k for k, g in groupby(list1)] 

и, конечно, вы могли бы «одна линия его» :)

from itertools import groupby; plop = [k for k, g in groupby(list1)] 

Или, если не используется набор, и не может быть никаких дубликатов - смежный или нет:

from collections import OrderedDict 
plop = list(OrderedDict.fromkeys(list1)) 
+0

* grumble * Я собирался написать «OrderedDict», что я использую на практике, если элементы хешируются. Ваше решение 'groupby' является более общим. – DSM

+0

@DSM То, что я обычно делаю, - это обновить копию 'more_itertools', а затем использовать рецепт' unique_everseen' вместо 'OrderedDict', но да ... хороший момент о том, что элементы должны быть хешируемыми ... И я полагаю, что справедливо добавить, что при использовании 'groupby' элементы должны быть упорядочимыми :) –

+0

Он, кажется, выбирает элементы из _another_, если нет дубликата (конечно, это может быть опечатка), вот почему я пошел путь понимания. Если это опечатка, да, лучше не дублировать то, что встроено. –

2

Я не знаю, почему «одна строка» требование, но вы могли бы сделать это с помощью понимания;

plop = [new_ls[i] for i in range(len(list1)) if list1[i] != list1[i-1]] 

... или если вы не имеете в виду сравнение первого и последнего элементов для первого значения;

plop = [v for (x,y,v) in zip(list1, [None]+list1, new_ls) if x != y] 
Смежные вопросы