在列表中找到特定频率以上的第一个元素

时间:2019-04-30 17:03:38

标签: python python-3.x

给出一个冻结的整数集列表,我如何找到出现在某个频率之上的第一个元素?

我正在实现的算法中有一个条件涉及超图对偶化。

给出两个超图G(实现为元组(G0,G1)),其中G0是顶点集合,G1是顶点的冻结集合(超边)列表,并且对于H同样(要注意,G0 =始终为H0)。

该算法的伪代码说是要在G1和H1中找到G1或H1中的任何x(由于某种理论而保证找到的)(可能是最快的x)可以找到),使得x的频率> = 1 / log(| G1 | + | H1 |)。

我天真地这样做:

def logOrMore(v,edges,sum):
    count = 0
    for edge in edges:
        if v in edge:
            count+=1
    if count >= (1/log(sum)):
        return True
    return False

并在主要算法中:

...code...
sum = len(G[1])+len(H[1])
x = 0
for v in G[0]:
    if logOrMore(v,G[1],sum):
        x = v
        break
if x ==0:
     for v in G[0]:
        if logOrMore(v,H[1],sum):
            x = v
            break
...more code...

当超图很大时,这已成为一个大问题。如何以最快的方式做到这一点?

G1的一个例子是

G1 = [frozenset({74, 76}), frozenset({73, 74, 29, 30}), frozenset({73, 74, 3, 4}), frozenset({74, 76, 29, 30}), frozenset({16, 73, 74}), frozenset({73, 74})]

但这是一个非常小的情况。最多可以达到列表内的1000个冻结集。

注意:整数的冻结集通常不会在大多数时间排序

这在Python 3.6.4中是有帮助的

1 个答案:

答案 0 :(得分:1)

因此,如@martineau的注释中所建议,您只能在开始时执行一次阈值计算并存储为变量。

另一种可能的清理方法是使用名为first的软件包。它被设计为可迭代并找到与条件匹配的第一个值。就您而言,听起来您正在寻找的值大于或等于阈值。

pip install first

文档中的示例,在列表中找到第一个偶数:

from first import first
first([1, 1, 3, 4, 5], key=lambda x: x % 2 == 0)

您可以使用此方法迭代冻结集以找到您的状况。但是,尽管有其他代码库,您也可以zip()一起使用G和H列表,并且仅使用一个for循环来检查它们。