2015-02-02 3 views
1

У меня есть эти списки:Попадая индексы последовательных кусков списка

l1 = ["foo","bar","x","y","z","x","y","z","x","y","z"] 
l2 = ["foo","bar","w","x","y","z","w","x","y","z","w","x","y","z"] 
l3 = ["foo","bar","y","z","y","z","y","z"] 

Для каждого из списка выше, я хотел бы получить индексы последовательных кусков от 3 входа и далее. Выход:

l1_indices = [[2,3,4],[5,6,7],[8,9,10]] 
l2_indices = [[2,3,4,5],[6,7,8,9],[10,11,12,13]] 
l3_indices = [[2,3],[4,5],[6,7]] 

Для дальнейшего уточнения, я получил l1_indices следующим образом:

["foo","bar", "x","y","z", "x","y","z", "x","y","z"] 
    0  1  2 3 4  5 6 7  8 9 10 <-- indices id 
       ---> onwards 
       ---> always in 3 chunks 

Что способ сделать это в Python?

Я попытался это, но не помогло:

In [8]: import itertools as IT 
In [9]: import operator 
In [11]: [list(zip(*g))[::-1] for k, g in IT.groupby(enumerate(l1[2:]), operator.itemgetter(1))] 
Out[11]: 
[[('x',), (0,)], 
[('y',), (1,)], 
[('z',), (2,)], 
[('x',), (3,)], 
[('y',), (4,)], 
[('z',), (5,)], 
[('x',), (6,)], 
[('y',), (7,)], 
[('z',), (8,)]] 
+1

Вы отправляете этот вопрос второй раз. Пожалуйста, подробно объясните, как вы получили '[[2, 3, 4], [5, 6, 7], [8, 9, 10]]' из 'l1 = [" foo "," bar "," х»,„у“,„г“,„х“,„у“,„г“,„х“,„у“,„г“] '. Если вы объясните, то люди помогут вам лучше. – Nilesh

+0

@ Lafada: см. Обновление. – pdubois

+0

А если у вас есть последовательность 'l1 = [" foo "," bar "," x "," y "," z ","? "," X "," y "," z "," x " , "y", "z"] ' – Nilesh

ответ

2

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

>>> def get_indices(l): 
...  last = len(l) - 2 
...  diff = last/3         
...  return [range(i, i + diff) for i in range(2, last, diff)] 
... 
>>> get_indices(l1) 
[[2, 3, 4], [5, 6, 7], [8, 9, 10]] 
>>> get_indices(l2) 
[[2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12, 13]] 
>>> get_indices(l3) 
[[2, 3], [4, 5]] 
+0

Что насчет '[" foo "," bar "," example "," x "," y "," z "," x "," y "," z "," x "," y "," z "]'? – Kasramvd

+0

@ KasraAD, OP подтвердили, что этого не произойдет. Всегда «с третьей записи вперед». Я упомянул два условия (оба подтвержденные OP), которые должны быть удовлетворены для ответа на работу. – taskinoor

+0

ахан, хорошо! я пропустил третий;) – Kasramvd

1

В качестве более общего ответа в первую очередь вы можете найти подсписок вашего списка, которые содержат элементы с длиной более 1, то на основании его длины и длины его набора вы можете копаться индексы Дезире:

>>> l =['foo', 'bar', 'w', 'x', 'y', 'z', 'w', 'x', 'y', 'z', 'w', 'x', 'y', 'z'] 

>>> s=[i for i in l if l.count(i)>2] 
>>> len_part=len(l)-len(s) 
>>> len_set=len(set(s)) 

>>> [range(i,i+l_s) for i in range(len_part,len(l),len_set)] 
[[2, 3, 4, 5], [6, 7, 8, 9], [10, 11, 12, 13]] 
Смежные вопросы