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

标签 python list indexing

我有一个列表列表:

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/

相关文章:

java - 递归查找字符串中字母出现的次数

python - 为什么我的 Python 代码显示错误的结果?

python - 使用 BeautifulSoup 在 Python 中抓取列表

postgresql - Postgres不会根据where子句中id的具体值来使用索引

python - 返回 python 列表中的第一个非 NaN 值

python - 添加列表和迭代器以形成新列表

r - 提取日期和时间并建立索引,其中 R 中的详细 OHLC 数据具有不同的打开和关闭时间

java - 在 Java 和 Python 中使用相同的时间格式

python - Pytest可以只实例化一个类对象来测试其所有方法吗?

python - 如何使用python从列表中读取数据并将特定值索引到Elasticsearch中?