จะเรียงตัวนับตามค่าอย่างไร? - งูหลาม


154

นอกเหนือจากการทำความเข้าใจรายการของความเข้าใจรายการที่กลับรายการมีวิธีไพโธนิกในการจัดเรียงตัวนับตามค่าหรือไม่? ถ้าเป็นเช่นนั้นจะเร็วกว่านี้:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x)
['a', 'b', 'c']
>>> sorted(x.items())
[('a', 5), ('b', 3), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()])]
[('b', 3), ('a', 5), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()], reverse=True)]
[('c', 7), ('a', 5), ('b', 3)

คำตอบ:


271

ใช้Counter.most_common()วิธีนี้มันจะจัดเรียงรายการให้คุณ :

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]

มันจะทำได้อย่างมีประสิทธิภาพสูงสุด หากคุณขอ Top N แทนค่าทั้งหมดheapqจะใช้ a แทนการจัดเรียงแบบตรง:

>>> x.most_common(1)
[('c', 7)]

นอกเคาน์เตอร์สามารถปรับการจัดเรียงตามkeyฟังก์ชันได้เสมอ .sort()และsorted()ทั้งสองเรียกได้ว่าให้คุณระบุค่าที่จะจัดเรียงลำดับการป้อนข้อมูล sorted(x, key=x.get, reverse=True)จะให้การจัดเรียงแบบเดียวกับx.most_common()คุณ แต่ส่งคืนเฉพาะคีย์ตัวอย่างเช่น:

>>> sorted(x, key=x.get, reverse=True)
['c', 'a', 'b']

หรือคุณสามารถจัดเรียงเฉพาะ(key, value)คู่ค่าที่กำหนด:

>>> sorted(x.items(), key=lambda pair: pair[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

ดูวิธีการเรียงลำดับ Pythonสำหรับข้อมูลเพิ่มเติม


33

คำตอบที่ดีกว่าสำหรับ@MartijnPietersคือการกลับพจนานุกรมที่จัดเรียงตามเหตุการณ์เนื่องจากCollections.most_commonส่งคืนค่าทูเพิลเท่านั้น ฉันมักจะจับคู่สิ่งนี้กับเอาต์พุต json สำหรับไฟล์บันทึกที่มีประโยชน์:

from collections import Counter, OrderedDict

x = Counter({'a':5, 'b':3, 'c':7})
y = OrderedDict(x.most_common())

ด้วยผลลัพธ์:

OrderedDict([('c', 7), ('a', 5), ('b', 3)])
{
  "c": 7, 
  "a": 5, 
  "b": 3
}

11

ใช่:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})

การใช้คีย์คำหลักที่เรียงลำดับและฟังก์ชันแลมด้า:

>>> sorted(x.items(), key=lambda i: i[1])
[('b', 3), ('a', 5), ('c', 7)]
>>> sorted(x.items(), key=lambda i: i[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

ใช้ได้กับพจนานุกรมทั้งหมด อย่างไรก็ตามCounterมีฟังก์ชั่นพิเศษที่ให้รายการที่เรียงลำดับแล้ว (จากบ่อยที่สุดไปหาบ่อยน้อยที่สุด) เรียกว่าmost_common():

>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]
>>> list(reversed(x.most_common()))  # in order of least to most
[('b', 3), ('a', 5), ('c', 7)]

คุณยังสามารถระบุจำนวนรายการที่คุณต้องการดู:

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]

อีกวิธีหนึ่งในการจัดเรียงย้อนกลับคือการตั้งค่าฟังก์ชันคีย์เป็นlamda i: -i[1]
Steinar Lima

4

จัดเรียงทั่วไปมากขึ้นโดยที่keyคีย์เวิร์ดกำหนดวิธีการเรียงลำดับลบก่อนประเภทตัวเลขบ่งชี้จากมากไปหาน้อย:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]

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