2015-01-16 3 views
-1

Предположим, что листДубликаты счетные с заказом сохраняющего в Python списки

[7,7,7,7,3,1,5,5,1,4]

Я бы например, удалять дубликаты и подсчитывать их при сохранении порядка списка. Для того, чтобы сохранить порядок списка удаления дубликатов я использую функцию

def unique(seq, idfun=None): 
    # order preserving 
    if idfun is None: 
     def idfun(x): return x 
    seen = {} 
    result = [] 
    for item in seq: 
     marker = idfun(item) 
     if marker in seen: continue 
     seen[marker] = 1 
     result.append(item) 
    return result 

, что дает мне выходного

[7,3,1,5,1,4]

, но желаемый результат я хочу бы (в окончательном списке может существует):

[7,3,3,1,5,2,4]

7 написано потому, что это первый элемент в списке, тогда проверяется, отличается ли оно от предыдущего. Если ответ да, подсчитайте вхождения одного и того же элемента, пока не будет найден новый. Затем повторите процедуру. Кто-нибудь более опытный, чем я, который мог бы дать мне подсказку, чтобы получить желаемый результат, указанный выше? Спасибо заранее

+1

Я думаю, что вы имеете в виду '7,4' –

+0

Вы уверены, что ваш желаемый список выходной верно? Например, если есть только одно значение, оставьте это количество? –

+0

Я хотел бы поблагодарить всех, кто проводил время, отвечая, теперь у меня есть лучшие подсказки о списках и словарях. На самом деле код в ответе выводит то, что я хочу: [7,4,3,1,5,2,1,4], но и другие ответы в некотором роде решают мою проблему. Спасибо большое! – user3782691

ответ

0

Попробуйте это

import collections as c 
lst = [7,7,7,7,3,1,5,5,1,4] 
result = c.OrderedDict() 
for el in lst: 
    if el not in result.keys(): 
     result[el] = 1 
    else: 
     result[el] = result[el] + 1 

print result 

распечатывает: OrderedDict([(7, 4), (3, 1), (1, 2), (5, 2), (4, 1)])

Это дает словарь, хотя. Для получения списка используйте:

lstresult = [] 
for el in result: 
    # print k, v 
    lstresult.append(el) 
    if result[el] > 1: 
     lstresult.append(result[el] - 1) 

Это не соответствует вашему желаемому результату, но ваш желаемый результат также представляется как своего родом коверкая того, что пытается представить

+2

'.keys()' не является необходимым, а в Python 2 будет загружаться список в память и делать 'in' check O (N) вместо O (1). 'el not in result' отлично работает – jamylak

1

Возможно, что-то вроде этого?

>>> from itertools import groupby 
>>> seen = set() 
>>> out = [] 
>>> for k, g in groupby(lst): 
    if k not in seen: 
     length = sum(1 for _ in g) 
     if length > 1: 
      out.extend([k, length]) 
     else: 
      out.append(k) 
     seen.add(k) 
...   
>>> out 
[7, 4, 3, 1, 5, 2, 4] 

Update:

По вашему comment я думаю, вы хотели что-то вроде этого:

>>> out = [] 
>>> for k, g in groupby(lst): 
    length = sum(1 for _ in g) 
    if length > 1: 
     out.extend([k, length]) 
    else: 
     out.append(k) 
...   
>>> out 
[7, 4, 3, 1, 5, 2, 1, 4] 
+3

Это на самом деле правильный ответ –

+1

true, это его странная структура для списка (я не знаю, для чего это использует OP), хотя это и решает это – jamylak