Python - 在列表列表中查找项目的索引

Jay*_*uso 14 python indexing list

我有一份清单清单:

colours=[["#660000","#863030","#ba4a4a","#de7e7e","#ffaaaa"],["#a34b00","#d46200","#ff7a04","#ff9b42","#fec28d"],["#dfd248","#fff224","#eefd5d","#f5ff92","#f9ffbf"],["#006600","#308630","#4aba4a","#7ede7e","#aaffaa"]]
Run Code Online (Sandbox Code Playgroud)

什么是最清洁的搜索列表的方式,并返回其中一个项目的位置,例如"#660000"

我查看了索引方法,但似乎没有解压缩列表中的列表.

postion=colours.index("#660000")
Run Code Online (Sandbox Code Playgroud)

给出:ValueError: ['#660000'] is not in list,不像[0][0]我期望的那样......

jco*_*ado 16

我会做这样的事情:

[(i, colour.index(c))
 for i, colour in enumerate(colours)
 if c in colour]
Run Code Online (Sandbox Code Playgroud)

这将返回一个元组列表,其中第一个索引是第一个列表中的位置,第二个索引是第二个列表中的位置(注意:c是您要查找的颜色,即,"#660000").

对于问题中的示例,返回的值为:

[(0, 0)]
Run Code Online (Sandbox Code Playgroud)

如果您只是需要找到以懒惰方式找到颜色的第一个位置,您可以使用:

next(((i, colour.index(c))
      for i, colour in enumerate(colours)
      if c in colour),
     None)
Run Code Online (Sandbox Code Playgroud)

这将返回找到的第一个元素的元组,或者None如果没有找到元素(如果没有找到元素,也可以删除None上面的参数将引发StopIteration异常).

编辑:正如@RikPoggi正确指出的那样,如果匹配数量很高,这将引入一些开销,因为colour迭代两次才能找到c.我认为这对于少量匹配是合理的并且对单个表达式有答案.但是,为了避免这种情况,您还可以使用以下相同的想法定义方法:

def find(c):
    for i, colour in enumerate(colours):
        try:
            j = colour.index(c)
        except ValueError:
            continue
        yield i, j

matches = [match for match in find('#660000')]
Run Code Online (Sandbox Code Playgroud)

请注意,既然find是一个生成器,您可以实际使用它,如上例所示,next在第一场比赛时停止并跳过进一步查看.


Rik*_*ggi 8

使用enumerate()你可以写一个像这样的函数:

def find(target):
    for i,lst in enumerate(colours):
        for j,color in enumerate(lst):
            if color == "#660000":
                return (i, j)
    return (None, None)
Run Code Online (Sandbox Code Playgroud)


Rik*_*ggi 7

使用可能更简单numpy

>>> import numpy
>>> ar = numpy.array(colours)
>>> numpy.where(ar=="#fff224")
(array([2]), array([1]))
Run Code Online (Sandbox Code Playgroud)

如您所见,您将获得一个包含所有行和列索引的元组。