我有一个列表列表:
colours = [["#660000","#863030","#ba4a4a","#de7e7e","#ffaaaa"],["#a34b00","#d46200","#ff7a04","#ff9b42","#fec28d"],["#dfd248","#fff224","#eefd5d","#f5ff92","#f9ffbf"],["#006600","#308630","#4aba4a","#7ede7e","#aaffaa"]]
搜索列表并返回其中一项的位置的最干净的方法是什么,例如“#660000”
?
我查看了 index
方法,但它似乎无法将列表解包到列表中。
postion = colours.index("#660000")
给出:ValueError: ['#660000'] is not in list
,不是我期望的[0][0]
...
最佳答案
我会做这样的事情:
[(i, colour.index(c))
for i, colour in enumerate(colours)
if c in colour]
这将返回一个元组列表,其中第一个索引是第一个列表中的位置,第二个索引是第二个列表中的位置(注意:c
是您要查找的颜色,即 “#660000”
)。
对于问题中的例子,返回值为:
[(0, 0)]
如果你只需要以懒惰的方式找到第一个找到颜色的位置,你可以使用这个:
next(((i, colour.index(c))
for i, colour in enumerate(colours)
if c in colour),
None)
这将返回找到的第一个元素的元组,如果没有找到元素,则返回 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')]
请注意,由于 find
是一个生成器,您实际上可以像上面的示例一样使用它和 next
以在第一个匹配项停止并跳过进一步查找。
关于python - 在列表列表中查找项目的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9553638/