ลบรายการที่ซ้ำกันออกจากรายการและเรียงลำดับตามจำนวน? (งูหลาม 3)
ฉันจะลบรายการที่ซ้ำกันทั้งหมดออกจากรายการและเรียงลำดับตามจำนวนได้อย่างไร
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 เพราะฉันพยายามตีกอล์ฟ / ย่อขนาดของโค้ดนี้ให้มากที่สุด ฉันพยายามหาคำตอบแล้วแต่ไม่พบอะไรเลย
คำตอบ
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))))
ลองออนไลน์!