2014-12-15 13 views
3

У меня есть этот список, который содержит только Ws и Ss:Найти длинные неразрывные общие элементы в списке

ls = ['W', 'S', 'S', 'S', 'W', 'W', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'W', 'W', 'W', 'W', 'W', 'W', 'S'] 

То, что я хочу сделать, это извлечь самый длинный неразрывный «S» в этом списке? и возвращает индекс этого Ss, возвращаясь:

['S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S'] 

и

[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 

Как я могу добиться этого?

+0

@thefourtheye: последний список является * индекс * из ls' из 'длинной Ss. – pdubois

+0

Исправлен ответ. – pdubois

ответ

11

Использование itertools.groupby с enumerate и max:

>>> from operator import itemgetter 
>>> from itertools import groupby 
>>> val = max((list(g) for k, g in 
        groupby(enumerate(ls), itemgetter(1)) if k == 'S'), key=len) 
>>> indices, items = zip(*val) 
>>> indices 
(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) 
>>> items 
('S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S') 
+1

Вам нужно добавить что-то, чтобы выбрать 'S' в частности, но да, я тоже писал« groupby' sol'n ». :-) – DSM

+0

@DSM Спасибо! Полностью упустило это требование. –

+0

С вашим элегантным состоянием, как я могу изменить, чтобы включить случаи, когда ни один из «S» не встречается в списке? – pdubois

-2
ls = ['W', 'S', 'S', 'S', 'W', 'W', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'S', 'W', 'W', 'W', 'W', 'W', 'W', 'S'] 
for x,y in enumerate(ls): 
    print (x,str(y).split("W")) 

Я нашел это.

+3

Это не похоже на то, что OP после , – DSM

3

То же решение, как Ashwini Чаудхари минус элегантность,

from itertools import groupby 

index, result, m_index = 0, [], 0 

# Group based on the elements of the list 
for item, grp in groupby(ls): 
    # Get the grouped items as a list 
    grp = list(grp) 
    # Filter out `M`s and check if this is the biggest run of `S`s ever seen 
    if item == "S" and len(grp) > len(result): 
     result, m_index = grp, index 
    # Increment the index to keep track of the list covered 
    index += len(grp) 

print(result, list(range(m_index, m_index + len(result)))) 
3
>>> import re 
>>> max((x.group(), x.span()) for x in re.finditer("S+", "".join(ls))) 
('SSSSSSSSSSS', (6, 17)) 

>>> range(6, 17) 
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
+0

Любите это ... +1 ... – thefourtheye

-1

пакет com.algo.sort;

общественного класса LargestCont {

static int g[]={1,1,1,1,2,2,3,4,5,5,5,5,5,5,5,5,5,5,5,2,2,2,2,3,3,3,3,3,3,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0}; 


public static void main(String f[]){ 
    manage(g); 
} 


public static void manage(int[] j){ 
    int max=1; int val=-1; int count=0; int ans=0; 
    for(int i=0;i<j.length;i++){ 
     if(j[i]!=val){ 
      if(max>count){ 
       ans=val; 
       count=max; 
       System.out.println(ans+"...."+count);     
      } 
     val=j[i]; max=1;}else{ 
      max++; 
     }     
    } 

    System.out.println(ans); 

} 

}

Смежные вопросы