Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找列表中高于特定频率的第一个元素_Python_Python 3.x - Fatal编程技术网

Python 查找列表中高于特定频率的第一个元素

Python 查找列表中高于特定频率的第一个元素,python,python-3.x,Python,Python 3.x,给定一个整数的冻结集列表,如何找到出现在某个特定频率以上的第一个元素 我正在实现的一个算法中有一个条件涉及超图二元化 给定两个超图G(实现为元组(G0,G1)),其中G0是顶点集,G1是顶点的冻结集(超边)列表,H也是如此(务必注意G0始终=H0) 该算法的伪代码表示,在G1和H1中,找到G1或H1中的任何x(,由于某些理论)(可能是你能找到的最快的一个),这样x的频率>=1/log(| G1 |+| H1 |) 我天真地这样做: def logOrMore(v,edges,sum):

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

我正在实现的一个算法中有一个条件涉及超图二元化

给定两个超图G(实现为元组(G0,G1)),其中G0是顶点集,G1是顶点的冻结集(超边)列表,H也是如此(务必注意G0始终=H0)

该算法的伪代码表示,在G1和H1中,找到G1或H1中的任何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中,如果这有帮助,

那么正如@martineau的评论所建议的那样,您可以在开始时只执行一次阈值计算,并作为变量存储

另一种可能的清理方法是使用名为
first
的包。它的设计目的是获取一个iterable并找到与条件匹配的第一个值。在您的情况下,听起来您正在寻找一个大于等于阈值的值

pip先安装

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

从第一次导入到第一次导入
第一个([1,1,3,4,5],key=lambda x:x%2==0)

您可以使用它来迭代您的冻结集,以找到您的条件。但是,尽管有代码库的其余部分,您可能可以将G和H列表一起
zip()
并使用一个for循环来检查它们

我只是不确定你是否提到了定单和未分类的泳衣。根据定义,集合是未排序的,因为它们没有排序,这与您的需求相关吗?@OlivierMelançon它不相关。它只是从文本文件中提取超图,有时(很少)会对冻结集(超边)进行排序,因为文本文件的边将被列为(1,2,3,4,5,6)。我不希望他们是,也没有任何含义的理论。我刚才提到了,以防这对你的帮助很重要。他们需要冷藏吗?使用另一种数据结构会带来很多可能性。@smallpants我的意思是,它们不需要这样,但我更愿意这样做,因为我的其余代码和函数以及我对算法的分析都是在冻结集的上下文中进行的。不过,我很乐意了解您的想法。您可以通过计算
threshold=(1/log(sum))来加速
logOrMore()
在函数的开头,然后检查
如果计数>=阈值:
循环中的
每次
计数
增加,并返回
,如果它因此提前退出。