リストの個別の要素を頻度で降順に並べ替えます


12

リストまたは配列を受け取り、頻度の降順でソートされた個別の要素のリストを返す関数を作成します。

例:

与えられた:

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

期待される戻り値:

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

コードゴルフかコードチャレンジか?
— マリヌス14年

コードゴルフ。それは間違いでした。ちょうどそれを修正
— ベルビ14年

回答:


13

APL(14)

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

これは、リストを受け取る関数です。例:

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

説明:

  • ∘.≡⍨⍵:配列内の各要素を配列内の他の各要素と比較し、行列を生成します
  • +⌿:行列の列を合計し、各要素の出現回数を与える
  • ⍒:下向きのソートのインデックスを与える
  • ⍵[... ]:⍵指定されたインデックスで並べ替え
  • ∪:一意の要素を取得する

3
それでも、彼らはどういうわけか、この簡潔で機知に富んだ言語からJavaへの移行を「進歩」と呼んでいますか?(-:
— ヒッピートレール14年

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
うーん、私はあなたが非なしのcmp関数と関数の両方を渡すことができるとは知りませんでしたkey。涼しい。
— Blckknght 14年

1
ちょっと短い:f=lambda n:sorted(set(n),key=n.count)[::-1]
— GRC

@grcに感謝します。エイリアンのスマイリーは、Python 3のケースでいくつかのキャラクターを保存します。
— Blckknght

5

Mathematica、31

Sort[GatherBy@n][[-1;;1;;-1,1]]

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

(とn = {"John", "Doe", "Dick", "Harry", "Harry", "Doe", "Doe", "Harry", "Doe", "John"})


ダーン、あなたはそこに私を得た:D
— イヴ・クレット

@YvesKlettありがとう。を取り除くことを考えてReverseいますが、Sort[GatherBy@n][[-1;;1, 1]]動作しません:)。何か案は?
— アジャシャ14年

ああ、
— わかっ

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}。&uniqのを行います。
— histocrat

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\-,}$`

どのように機能しますか?

  • :aa後で使用するために、元の配列のコピーを変数に保存します。

  • .| 副作用としての重複を排除して、配列とそれ自体の集合和集合を計算します。

  • { }$中括弧内のコードによって計算されたカスタムソートキーを使用して、重複排除された配列をソートします。このコードは、各配列要素を取得し、配列減算を使用してa、に保存されている元の入力配列から削除し、残りの要素の数をカウントします。したがって、要素は頻度の降順でソートされます。

追伸 元の30文字バージョンについては、こちらをご覧ください。


それ[a\])^はに等しいはずだと思います[.;]a\-。一致しない要素の数でソートするのは良い考えです。
— ピーターテイラー14年

悲しいかな、いいえ:^重複を折りたたみますが、-しません。(およびITYM (ではなく)。)[a\](\-は機能しますが、文字は保存されません。
— イルマリカロネン14年

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" 

しかし、それはのとても素敵ではないショートカット使用TするとTRUE...


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
— マナトワーク14年

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

array_count_values()私が見ることができるように、重複した値を削除したり、それらを順序付けたりしません。
— ヴェレオ14年

重複を削除します…順序付けしません…=> arsort
— bwoebi

@bwoebiそうですね。残念ながら、そのように書くと、この答えよりも1文字長くなります。
— ティムセギーン14年

なぜ道はarray_count_values長くなるのですか?<?$u=array_count_values($_GET);arsort($u);print_r($u);私の意見では54バイトです
— イェルクHülsermann

1

ルビー: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

{ドー、ハリー、ジョン、ディック}


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/


ハーモニーさんと脂肪の矢印機能:f=n=>{m={};n.forEach(e=>m[e]=m[e]+1||1);return Object.keys(m).sort((a,b)=>m[b]-m[a])}。(現在はFirefoxのみ)
— マナトワーク14年

を使用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

説明:最初の2行は必要なインポートであり、コードの次の行は型シグネチャ(通常は不要)、実際の関数は最後の行です。この関数は、リストを自然な順序で並べ替え、等しい要素をリストにグループ化し、サイズの降順でリストのリストを並べ替え、各リストの最初の要素を取得します。

輸入を含む全長: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

Perl

指定されたI / O仕様を満たすには、120文字が必要です

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

行ごとに1つのアイテムを取得し、行ごとに1つのアイテムを印刷することによる純粋な最短コード

$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 14年


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機能を使用する場合があります。私はチェックするのが面倒です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.