获取列表的顺序块的索引

时间:2015-02-02 08:29:40

标签: python list

我有这些清单:

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,)]]

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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]]