按频率降序对列表的不同元素进行排序


12

编写一个函数,该函数接受一个列表或数组,并返回一个不同元素的列表,这些元素按频率降序排列。

例:

鉴于:

["John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John"]

预期返回值:

["Doe","Harry","John","Dick"]

代码高尔夫还是代码挑战?
marinus 2014年

代码高尔夫球。那是错误的。只是纠正
贝尔韦

Answers:


13

APL(14)

{∪⍵[⍒+⌿∘.≡⍨⍵]}

这是一个带有列表的函数,例如:

      names
 John  Doe  Dick  Harry  Harry  Doe  Doe  Harry  Doe  John 
      {∪⍵[⍒+⌿∘.≡⍨⍵]} names
 Doe  Harry  John  Dick

说明:

  • ∘.≡⍨⍵:将数组中的每个元素与数组中的每个其他元素进行比较,得到一个矩阵
  • +⌿:对矩阵的列求和,给出每个元素出现多少次
  • :给出向下排序的索引
  • ⍵[... ]按给定索引重新排序
  • :获取独特元素

3
但是他们以某种方式称呼从这种简洁的机智语言到Java的“进步”?(-:
hippietrail 2014年

8

Python 3-47 43; Python 2-40 39

对于Python 3:

f=lambda n:sorted(set(n),key=n.count)[::-1]

对于Python 2:

f=lambda n:sorted(set(n),cmp,n.count,1)

演示:

>>> names = ["John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John"]
>>> f(names)
['Doe', 'Harry', 'John', 'Dick']

1
我试图发布相同的内容,但这是一个修改。f=lambda n:sorted(set(n),cmp,n.count,1)39个字符
YOU

1
嗯,我没有意识到您可以同时传递一个Non-None cmp函数和一个key函数。凉。
Blckknght 2014年

1
简短一点:f=lambda n:sorted(set(n),key=n.count)[::-1]
grc 2014年

感谢@grc,外星人的笑容确实在Python 3案例中保存了一些字符。
Blckknght 2014年


4

Mathematica(26 37

n = {"John", "Doe", "Dick", "Harry", "Harry", "Doe", "Doe", "Harry", "Doe", "John"}

Last/@Gather@n~SortBy~Length//Reverse

{“ Doe”,“ Harry”,“ John”,“ Dick”}


Mathematica V10 +(26)

Keys@Sort[Counts[n],#>#2&]

@garej使用的较旧版本。发布为另一个答案?
伊夫·克莱特

如果您不介意的话,我已经添加到您的...
garej

@garej。谢谢,优秀的解决方案!
伊夫·克莱特

3

Perl 6(36个字节,35个字符)

»>>如果您无法处理UTF-8,可以将替换为。我几乎可以肯定它会更短一些,但是Bag该类的行为(可悲)是相对奇怪的,并且由于它是相对较新的(但它可以计算参数)而并不真正完整。{}声明一个匿名函数。

{(sort -*.value,pairs bag @_)».key}

样本输出(来自Perl 6 REPL):

> my @names = ("John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John")
John Doe Dick Harry Harry Doe Doe Harry Doe John
> {(sort -*.value,pairs bag @_)».key}(@names)
Doe Harry John Dick

3

红宝石:34 37 人物

f=->a{a.sort_by{|z|-a.count(z)}&a}

(编辑:以前的30个字符的解决方案是函数的主体)


您可以使用修剪一些字符f=->a{a.sort_by{|z|-a.count(z)}&a}。这样&做是唯一的。
histocrat 2014年

3

GolfScript,14个字符(19个为命名函数,另外14个为完整程序)

:a.|{[.]a\-,}$

此代码在堆栈上获取一个数组,并按出现次数降序对其唯一元素进行排序。例如,如果输入数组为:

["John" "Doe" "Dick" "Harry" "Harry" "Doe" "Doe" "Harry" "Doe" "John"]

那么输出数组将是

["Doe" "Harry" "John" "Dick"]

注意:上面的代码是一个简单的语句序列。要将其转换为命名函数,请用花括号将其包装并分配一个名称,如下所示:

{:a.|{[.]a\-,}$}:f;

或者,要将代码转换为完整的程序,该程序从标准输入中读取列表(使用上面显示的列表符号)并将其打印到标准输出中,请在代码前~添加和追加`[. 在这种情况下可以省略(因为我们知道堆栈上将没有其他内容),因此生成的14个字符的程序将为:

~:a.|{]a\-,}$`

它是如何工作的?

  • :a将原始数组的副本保存在变量中,a以备后用。

  • .| 计算数组与其自身的集合并集,从而消除重复项的副作用。

  • { }$使用括号内代码计算的自定义排序键对重复数据删除的数组进行排序。此代码获取每个数组元素,使用数组减法将其从保存在中的原始输入数组中删除a,并计算剩余元素的数量。因此,元素以频率降序排序。

附言 有关原始30个字符的版本,请参见此处


我认为[a\])^应该等同于[.;]a\-。按不匹配元素的数量排序是一个不错的主意。
彼得·泰勒

las,否:不会^折叠重复项,-不会。(和ITYM (,不是)。)[a\](\-可以工作,但是不会保存任何字符。
Ilmari Karonen 2014年

2

R:23个字符

n <- c("John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John")

names(sort(table(n),T))
## [1] "Doe"   "Harry" "John"  "Dick" 

但是它使用了不太好的快捷方式TTRUE...


1

如果这适合这里: In sql-server

create table #t1 (name varchar(10))
insert into #t1 values ('John'),('Doe'),('Dick'),('Harry'),('Harry'),('Doe'),('Doe'),('Harry'),('Doe'),('John')


select name from #t1 group by name order by count(*) desc

要么

with cte as
(

select name,count(name) as x from #t1 group by name
)

select name from cte order by x desc

看到它在行动


1
为什么选择CTE?select name from #t1 group by name order by count(*) desc
manatwork 2014年

1

PHP,63 62 61字符

function R($a){foreach($a as$v)$b[$v]++;arsort($b);return$b;}

演示:

$c = array("John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John");
$d = print_r(R($c));

Array ( [Doe] => 4 [Harry] => 3 [John] => 2 [Dick] => 1 )

看看array_count_values()……这就是您所需要使用的(包括arsort()
bwoebi 2014年

array_count_values()如我所见,它不会删除重复的值,也不会排序它们。
Vereos 2014年

它删除了重复项……只是不命令它们……=> arsort
bwoebi 2014年

@bwoebi你是对的。不幸的是,以这种方式编写的代码比此答案长1个字符。
Tim Seguine 2014年

为什么要用array_count_values更长的时间?<?$u=array_count_values($_GET);arsort($u);print_r($u);是54个字节在我看来
约尔格Hülsermann

1

Ruby:59个字符

f=->n{n.group_by{|i|i}.sort_by{|i|-i[1].size}.map{|i|i[0]}}

样品运行:

irb(main):001:0> f=->n{n.group_by{|i|i}.sort_by{|i|-i[1].size}.map{|i|i[0]}}
=> #<Proc:0x93b2e10@(irb):2 (lambda)>

irb(main):004:0> f[["John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John"]]
=> ["Doe", "Harry", "John", "Dick"]

1

Mathematica,39个字符

f = Reverse[First /@ SortBy[Tally@#, Last]] &

names = {"John", "Doe", "Dick", "Harry", "Harry",
         "Doe", "Doe", "Harry", "Doe", "John"};

f@names

{Doe,Harry,John,Dick}


1

的JavaScript(ECMAScript5):118个 113字符

function f(n){m={}
for(i in n){m[n[i]]=m[n[i]]+1||1}
return Object.keys(m).sort(function(a,b){return m[b]-m[a]})}

http://jsfiddle.net/mblase75/crg5B/


具有Harmony的粗箭头功能f=n=>{m={};n.forEach(e=>m[e]=m[e]+1||1);return Object.keys(m).sort((a,b)=>m[b]-m[a])}。(当前仅在Firefox中使用。)
manatwork'1

您可以使用m[n[i]]=-~m[n[i]]递增,而在循环主体中不需要{}。
尼尔

1

Haskell-53个字符

import Data.List
import Data.Ord

f :: (Eq a, Ord a) => [a] -> [a]
f=map head.(sortBy$flip$comparing length).group.sort

说明:前两行是必需的导入,代码的下一行是类型签名(通常不是必需的),实际功能是最后一行。该函数按其自然顺序对列表进行排序,将相等的元素分组为列表,按大小降序对列表列表进行排序,并获取每个列表中的第一个元素。

包括进口的总长度:120

不带进口但有类型签名:86

功能本身:53


1

Clojure:43个字符

功能:

#(keys(sort-by(comp - val)(frequencies %)))

演示(repl):

user=> (def names ["John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John"])
#'user/names
user=> (#(keys(sort-by(comp - val)(frequencies %))) names)
("Doe" "Harry" "John" "Dick")

0

佩尔

要满足给定的I / O规格,我需要120个字符

s!"([^"]+)"[],]!$a{$1}++!e while(<>);print 'MostOccuring = [',join(',',map{qq("$_")}sort{$a{$a}<=>$a{$b}}keys %a),"]\n"

每行取一项,每行打印一项的最短代码,我只需要55个字符

$a{$_}++ while(<>);print sort{$a{$a}<=>$a{$b}}keys %a)

0

C#:111个字符

List<string>M(List<string>l){return l.GroupBy(q=>q).OrderByDescending(g=>g.Count()).Select(g=>g.Key).ToList();}

(在一堂课内)

var names = new List<string> {"John", "Doe", "Dick", "Harry", "Harry", "Doe", "Doe", "Harry", "Doe", "John"};
foreach(var s in M(names))
{
    Console.WriteLine(s);
}

母鹿

哈里

约翰

迪克

使用LINQ的简单解决方案。


您也可以删除.ToList() ,因为序列获得通过枚举的foreach
亚当斯佩特

没错,但是然后我必须将返回类型更改为IEnumerable <string>
paavohtl 2014年

0

R(22)

names(sort(-table(x)))

作为一个功能,它将需要多11个字符。

用法:

> x = c("John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John")
> names(sort(-table(x)))
[1] "Doe"   "Harry" "John"  "Dick"

这需要来自变量的输入,这是社区共识不允许的
硕果累累

0

斯卡拉(71)

(x.groupBy(a=>a)map(t=>(t._1,t._2.length))toList)sortBy(-_._2)map(_._1)

取消高尔夫:

def f(x:Array[String]) =
  (x.groupBy(a => a) map (t => (t._1, t._2.length)) toList) 
    sortBy(-_._2) map(_._1)

0

J,8个字节

~.\:#/.~

用法

名称存储为一组带框的字符串。

   'John';'Doe';'Dick';'Harry';'Harry';'Doe';'Doe';'Harry';'Doe';'John'
┌────┬───┬────┬─────┬─────┬───┬───┬─────┬───┬────┐
│John│Doe│Dick│Harry│Harry│Doe│Doe│Harry│Doe│John│
└────┴───┴────┴─────┴─────┴───┴───┴─────┴───┴────┘
   f =: ~.\:#/.~
   f 'John';'Doe';'Dick';'Harry';'Harry';'Doe';'Doe';'Harry';'Doe';'John'
┌───┬─────┬────┬────┐
│Doe│Harry│John│Dick│
└───┴─────┴────┴────┘

说明

~.\:#/.~   Input: A
    #/.~   Finds the size of each set of identical items (Frequencies)
~.         List the distinct values in A
           Note: the distinct values and frequencies will be in the same order
  \:       Sort the distinct values in decreasing order according to the frequencies
           Return the sorted list implicitly

0

CJam,15个字节(可能是非竞争)

q~$e`{0=W*}$1f=

此挑战发布后,可能会使用CJam功能。我懒得检查。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.