Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Julia 对计数器进行排序(并提取最常见的值)_Julia - Fatal编程技术网

Julia 对计数器进行排序(并提取最常见的值)

Julia 对计数器进行排序(并提取最常见的值),julia,Julia,提供了一组很棒的工具,其中一个是。相应的Python对象,Counter提供了一个最常用的方法。这将如何在Julia中实现?可以通过选择来完成繁重的工作。以下内容应重现Python中最常见的行为: using DataStructures most_common(c::Accumulator) = most_common(c, length(c)) most_common(c::Accumulator, k) = select!(collect(c), 1:k, by=kv->kv

提供了一组很棒的工具,其中一个是。相应的Python对象,
Counter
提供了一个
最常用的方法。这将如何在Julia中实现?

可以通过
选择来完成繁重的工作。以下内容应重现Python中最常见的
行为:

using DataStructures

most_common(c::Accumulator)    = most_common(c, length(c))
most_common(c::Accumulator, k) = select!(collect(c), 1:k, by=kv->kv[2], rev=true)
在Julia获得专门化函数参数
by=kv->kv[2]
(这是计划中的)的能力之前,性能将受到影响;在对returns视图(这也是计划中的)进行索引之前,它将执行不必要的复制以创建正确长度的输出向量。但只要它不是性能关键型的,上述功能就可以正常工作


当然,性能问题可以通过更仔细、低级别的实现来处理。我不知道有没有用于此的现有函数,但它可能是DataStructures.jl或Julia本身值得添加的。这对于不是计数器或累加器的关联集合也是有意义的,但可能应该命名为其他名称。

要更新此问题,我使用的是Julia v1.2.1,没有
选择afaik

下面是对我使用的@Toivo实现的一个轻微修改:

using DataStructures

most_common(c::Accumulator) = most_common(c, length(c))
most_common(c::Accumulator, k) = sort(collect(c), by=kv->kv[2], rev=true)[1:k]
这将返回一个
::数组{Pair{String,Int}},1
,具有
k
成员,类似于Python
计数器。最常见的(k)
,它返回一个最大为
k
的元组对列表

示例:

使用Python
Counter
和Julia
DataStructures.Counter查找《哈姆雷特》中最常见的十个单词

Python:

>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
 ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
朱莉娅:

> import DataStructures: counter
> open("hamlet.txt") do f
>     words = matchall(r"\w+", read(f, String))
>     counter(words)|> most_common
> end
10-element Array{Pair{Any,Int64},1}:
"the" => 1143
"and" => 966
"to" => 762
 ...
我没有足够的经验来评论效率,但我很想听听专家们的意见