เรียงลำดับองค์ประกอบที่แตกต่างของรายการตามลำดับจากมากไปน้อยตามความถี่


12

เขียนฟังก์ชั่นที่รับรายการหรืออาเรย์แล้วส่งกลับรายการองค์ประกอบที่แตกต่างเรียงลำดับจากมากไปน้อยตามความถี่

ตัวอย่าง:

ได้รับ:

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

ค่าตอบแทนที่คาดหวัง:

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

รหัสกอล์ฟหรือรหัสท้าทาย?
marinus

รหัสกอล์ฟ นั่นเป็นความผิดพลาด เพียงแก้ไขให้ถูกต้อง
belvi

คำตอบ:


13

APL (14)

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

นี่คือฟังก์ชั่นที่รับรายการเช่น:

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

คำอธิบาย:

  • ∘.≡⍨⍵: เปรียบเทียบแต่ละองค์ประกอบในอาร์เรย์กับองค์ประกอบอื่น ๆ ในอาร์เรย์ให้เมทริกซ์
  • +⌿: รวมคอลัมน์ของเมทริกซ์โดยให้แต่ละองค์ประกอบเกิดขึ้นกี่ครั้ง
  • : ดัชนีให้เรียงลำดับลง
  • ⍵[... ]: เรียงลำดับใหม่ตามดัชนีที่ให้มา
  • : รับองค์ประกอบที่เป็นเอกลักษณ์

3
และอย่างใดพวกเขาเรียกไปจากภาษาที่มีไหวพริบกระชับเพื่อ Java "คืบหน้า"? (-:
hippietrail

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 ตัวอักษร
คุณ

1
อืมฉันไม่คิดว่าคุณสามารถส่งผ่านทั้งcmpฟังก์ชั่นที่ไม่ใช่ไม่มีและkeyฟังก์ชั่น เย็น.
Blckknght

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"})


Darn คุณมาถึงฉันแล้ว: D
Yves Klett

@YvesKlett ขอบคุณ ฉันกำลังคิดที่จะกำจัดReverseแต่Sort[GatherBy@n][[-1;;1, 1]]มันก็ไม่ได้ผล :) ความคิดใด ๆ
Ajasja


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 รุ่นเก่าที่ใช้อยู่ โพสต์เป็นคำตอบอื่นหรือไม่
Yves Klett

ฉันเพิ่มให้คุณแล้วถ้าคุณไม่รังเกียจ ...
garej

@garej ขอบคุณทางออกที่ยอดเยี่ยม!
Yves Klett

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 char ก่อนหน้านี้เป็นเนื้อความของฟังก์ชัน)


f=->a{a.sort_by{|z|-a.count(z)}&a}คุณสามารถตัดไม่กี่ตัวอักษรด้วย &ไม่ UNIQ
ฮิสโทแกต

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และนับจำนวนองค์ประกอบที่เหลือ ดังนั้นองค์ประกอบจะเรียงลำดับตามความถี่ที่ลดลง

ps ดูที่นี่สำหรับเวอร์ชั่นเดิม 30 ตัวอักษร


ผมคิดว่าควรจะเทียบเท่ากับ[a\])^ [.;]a\-การเรียงลำดับตามจำนวนองค์ประกอบที่ไม่ตรงกันเป็นความคิดที่ดี
Peter Taylor

อนิจจาไม่: ^ยุบซ้ำซ้อน-ไม่ (และ ITYM (ไม่ใช่)) [a\](\-จะใช้งานได้ แต่จะไม่บันทึกอักขระใด ๆ
Ilmari Karonen

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
จัดการ

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()ไม่ลบค่าที่ซ้ำกันหรือสั่งซื้อพวกเขาอย่างที่ฉันเห็น
Vereos

มันลบรายการที่ซ้ำกัน…มันไม่ได้สั่งให้พวกเขา… =>
arsort

@bwoebi คุณพูดถูก น่าเสียดายที่การเขียนด้วยวิธีนี้มีความยาวมากกว่า 1 ตัวอักษร
Tim Seguine

ทำไมถึงมีarray_count_valuesอีกต่อไป? <?$u=array_count_values($_GET);arsort($u);print_r($u);คือ 54 ไบต์ในความคิดของฉัน
JörgHü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/


ด้วยความสามัคคีของฟังก์ชั่นลูกศรไขมันf=n=>{m={};n.forEach(e=>m[e]=m[e]+1||1);return Object.keys(m).sort((a,b)=>m[b]-m[a])} : (ปัจจุบันเฉพาะใน Firefox)
จัดการ

คุณสามารถใช้m[n[i]]=-~m[n[i]]เพื่อเพิ่มและคุณไม่จำเป็นต้อง {} s รอบ ๆ ร่างกายของวง
Neil

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 %)))

การสาธิต (ในแบบจำลอง):

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"

รหัสที่สั้นที่สุดบริสุทธิ์โดยการหนึ่งรายการต่อบรรทัดและพิมพ์หนึ่งรายการต่อบรรทัดฉันต้องการเพียง 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
Adam Speight

นั่นเป็นความจริง แต่แล้วผมต้องเปลี่ยนประเภทกลับเข้าไปในIEnumerable <สตริง>
paavohtl

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)

Ungolfed:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.