我的目标是在一个大的列表中找到包含某个值的元素的索引(以1百万个条目为例,每个条目由3个元素组成):

e、 g让我们把 list 列为a

a = [[0,1,2],[0,5,6],[7,8,9]]

我想检索包含值0的元素的索引,因此我的函数将返回0,1

我的第一次try 是:

def any_identical_value(elements,index):

    for el in elements:

        if el == index:

            return True

    return False


def get_dual_points(compliant_cells, index ):
      compliant = [i for i,e in enumerate(compliant_cells) if any_identical_value(e,index)]
      return compliant


result = get_dual_points(a,0)

该解决方案工作正常,但对于大型列表来说效率非常低.具体来说,我的目标是执行一系列的任务,这些任务是主要列表中的值的总数,因此在上面的例子9中为n_queries = len(a)*3.

这里有两个问题:

  • 列表是完成这项任务的良好数据 struct 吗?
  • 有没有更有效的算法解决方案?

推荐答案

您可以一次性(O(N)次)散列所有索引,这将允许您在O(1)次内回答查询.

from collections import defaultdict

d = defaultdict(list)
a = [[0,1,2],[0,5,6],[7,8,9]]
queries = [0,1]
for i in range(len(a)):
    for element in a[i]:
        d[element].append(i)

for x in queries:
    print(d[x])

# prints
# [0, 1]
# [0]

Python相关问答推荐

如何使用kivy文件中创建的元素在另一个kivy文件中创建另一个元素?

如何模拟4个粒子相互移动的运动?

如何循环循环的每个元素并过滤掉Python rame中的条件

如何在Pandas 中存储二进制数?

键盘.任务组

如何在Power Query中按名称和时间总和进行分组

将列表中的元素替换为收件箱中的元素

Polars Dataframe:如何按组删除交替行?

如何使用PyTest根据self 模拟具有副作用的属性

在Python中管理多个OpenGVBO和VAO实例

Python主进程和分支进程如何共享gc信息?

优化在numpy数组中非零值周围创建缓冲区的函数的性能

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

如何使用pandasDataFrames和scipy高度优化相关性计算

Matlab中是否有Python的f-字符串等效物

更改键盘按钮进入'

Python,Fitting into a System of Equations

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

如何保持服务器发送的事件连接活动?

计算天数