ลบรายการที่ซ้ำกันออกจากรายการและเรียงลำดับตามจำนวน? (งูหลาม 3)

Aug 19 2020

ฉันจะลบรายการที่ซ้ำกันทั้งหมดออกจากรายการและเรียงลำดับตามจำนวนได้อย่างไร

s = ["foo", "this", "lem", "foo", "lem"]
s = ["foo", "ebh", "wosv", "wosv", "ebh", "4whcu"]
#should return
>>> ["foo", "lem", "this"]
>>> ["ebh", "wosv", "foo", "4whcu"]

กฎ:

  • ต้องสั้นกว่าโค้ดด้านล่างในแง่ของขนาดไบต์
  • คำสั่งซื้อจะต้องขึ้นอยู่กับการนับจากมากไปหาน้อย
  • หากมีสองสายที่มีจำนวนเท่ากันลักษณะแรกจะเกิดขึ้นก่อน
  • ต้องลบรายการที่ซ้ำกันทั้งหมดเพียงหนึ่งสตริงในรายการสุดท้าย

ฉันมี

list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))

ฉันสังเกตเห็นคำตอบเช่นนี้setแต่มันเปลี่ยนลำดับโดยพลการซึ่งฉันไม่ต้องการ

แก้ไข:ขออภัยสำหรับคุณภาพที่ไม่ดีก่อนหน้านี้ ฉันเคยแส้สิ่งนี้ก่อนที่ฉันจะนอนหลับและฉันก็ค่อนข้างเหนื่อย นี่ไม่ใช่สำหรับ StackOverflow เพราะฉันพยายามตีกอล์ฟ / ย่อขนาดของโค้ดนี้ให้มากที่สุด ฉันพยายามหาคำตอบแล้วแต่ไม่พบอะไรเลย

คำตอบ

2 xnor Aug 20 2020 at 17:37

44 ไบต์

sorted({}.fromkeys(s),key=s.count,reverse=1)

ลองออนไลน์!

การปรับปรุงด้านล่างโดยแทนที่คีย์ด้วยบิวท์อินแทนที่จะเป็น a lambdaและใช้reverseเพื่อสลับการเปรียบเทียบ เราต้องการทำ[::-1]ผลลัพธ์สุดท้ายแทน แต่นั่นไม่ได้เป็นการทำลายที่มั่นคงที่ถูกต้อง


47 ไบต์

sorted({}.fromkeys(s),key=lambda y:-s.count(y))

ลองออนไลน์!

การย้ายรหัสของคุณง่ายๆโดยย้าย{}.fromkeysเคล็ดลับการทำซ้ำก่อนการจัดเรียง เนื่องจากการเรียงลำดับจะแปลงเป็นรายการการแยกคีย์จากพจนานุกรมสิ่งนี้จะบันทึกการlist()เรียกของต้นฉบับ

เพื่อความสะดวกในการอ้างอิงรหัสเดิมคือ:

53 ไบต์

list({}.fromkeys(sorted(s,key=lambda y:-s.count(y))))

ลองออนไลน์!