Python:列表列表中的索引

时间:2014-09-23 15:58:29

标签: python list python-2.7 list-comprehension

我的列表如下所示:

G = [ [0,3,4],[1,0,0],[9,5,4],[4,3,2],[3,2,3],[0,1,4],[1,0,0],[1,0,0],[1,0,0],[1,0,0] ]

我希望找到连续跟随 [1, 0, 0]的索引。在这种情况下,[1,0,0]连续出现4次,即如果[1,0,0]出现4次,那么输出应为7.我的表达式的输出是错误的!

的输出
index =[i for i, j in enumerate(G) if j == [1,0,0]] 

index = [1, 6, 7, 8, 9]

我该如何解决这个问题?

被修改

非常重要的是在这个问题中找到模式的索引[1,0,0],如果在此之后没有出现其他模式。在列表中,G是索引6而不是7!

3 个答案:

答案 0 :(得分:2)

鉴于应用程序,最好使用reversed向后遍历列表并找到第一个非目标元素。

我还将使用enumerate同时迭代反转列表的元素和索引。我们第一次看到非目标元素时,我们可以突破循环。此时,从列表长度中减去索引计数器将为我们提供最后一个非目标元素的索引。

for ind, el in enumerate(reversed(G)):
    if el != [1, 0, 0]:
        break
else:  # This block is only run when no breaks are encountered in the for loop
    ind = ind + 1  # Adjust for when the entire list is the target
result = len(G) - ind
# 6

请注意,Python索引从0开始,因此6实际上是正确答案,而不是7.如果您需要1索引版本,则只需添加1即可。

答案 1 :(得分:1)

>>> G = [ [0,3,4],[1,0,0],[9,5,4],[4,3,2],[3,2,3],[0,1,4],
...       [1,0,0],[1,0,0],[1,0,0],[1,0,0] ]
>>> next(i for i, (x,y) in enumerate(zip(G, G[1:])) if x == y)
6

(如果您只想检查.. if x == y == [1, 0, 0]

,请使用[1, 0, 0]

如果没有连续的项目,这将引发StopIteration。

>>> G = [ [1,2,3] ]
>>> next(i for i, (x,y) in enumerate(zip(G, G[1:])) if x == y)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

为防止这种情况,请传递默认值:

>>> next((i for i, (x,y) in enumerate(zip(G, G[1:])) if x == y), -1)
-1

更新根据OP的评论:

import itertools

def find_target(lst, target):
    target = tuple(target)
    i, maxidx, maxcnt = 0, -1, 0
    for key, grp in itertools.groupby(lst, key=tuple):
        cnt = sum(1 for _ in grp)
        if key == target and cnt > maxcnt:
            maxidx, maxcnt = i, cnt
        i += cnt
    return maxidx

用法:

>>> G = [[0,3,4], [1,0,0], [9,5,4], [1,0,0], [1,0,0],
...      [1,0,0], [1,0,0], [23,4,1], [1,0,0], [1,0,0],
...      [1,0,0], [1,0,0],[1,0,0], [1,0,0], [1,0,0],
...      [1,0,0]]
>>>
>>> find_target(G, [1, 0, 0])
8
>>> find_target([], [1, 0, 0])
-1
>>> find_target([[1, 0, 0]], [1, 0, 0])
0
>>> find_target([[2, 3, 4], [1, 0, 0], [1, 0, 0]], [1, 0, 0])
1

答案 2 :(得分:-1)

这样的东西?

for ii in range(len(G)-1, 0, -1):
    if G[ii-1] != [1,0,0]: 
        break

结果ii是期望的指数

如果你的意思是最后一个元素,而不是特别地[1,0,0],你应该用G [-1]代替[1,0,0],这将适用于:

G = [ [2,3,4], [1,3,4], [1,3,4]] 

给出1作为答案