การเรียงลำดับรายการ Python ตามความยาวของสตริง


110

ฉันต้องการจัดเรียงรายการสตริงตามความยาวสตริง ฉันพยายามใช้การเรียงลำดับดังนี้ แต่ดูเหมือนจะไม่ได้ผลลัพธ์ที่ถูกต้อง

xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs

['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']

อาจจะผิดพลาดอะไร

คำตอบ:


201

เมื่อคุณส่งผ่านlambdaไปsortคุณต้องส่งคืนจำนวนเต็มไม่ใช่บูลีน ดังนั้นรหัสของคุณควรอ่านดังนี้:

xs.sort(lambda x,y: cmp(len(x), len(y)))

โปรดทราบว่าcmpเป็นฟังก์ชั่นในตัวดังกล่าวว่าcmp(x, y)ผลตอบแทน -1 ถ้าxน้อยกว่าy0 ถ้าxมีค่าเท่ากับy1 และถ้ามีค่ามากกว่าxy

แน่นอนคุณสามารถใช้keyพารามิเตอร์แทน:

xs.sort(key=lambda s: len(s))

สิ่งนี้จะบอกsortวิธีการสั่งซื้อโดยพิจารณาจากสิ่งที่ฟังก์ชันคีย์ส่งกลับ

แก้ไข: ขอบคุณ balpha และ Ruslan ด้านล่างที่ชี้ให้เห็นว่าคุณสามารถส่งผ่านlenโดยตรงเป็นพารามิเตอร์หลักไปยังฟังก์ชันได้ดังนั้นจึงไม่จำเป็นต้องมีlambda:

xs.sort(key=len)

และดังที่ Ruslan ชี้ให้เห็นด้านล่างคุณยังสามารถใช้ฟังก์ชันการเรียงลำดับในตัวแทนlist.sortวิธีการซึ่งจะสร้างรายการใหม่แทนที่จะจัดเรียงรายการที่มีอยู่ในตำแหน่ง:

print(sorted(xs, key=len))

32
ไม่จำเป็นต้องlambda; แค่ใช้key = len
balpha

15
สิ่งนี้จะเรียงลำดับจากน้อยไปหามาก (ความยาวของคำที่เล็กกว่าที่ด้านบน) เพื่อเรียงลำดับจากมากไปหาน้อย (ความยาวของคำที่เล็กกว่าที่ด้านล่าง) เพิ่มพารามิเตอร์reverse = True
Ajay Gupta

การxs.sort()พ่น "TypeError: sort () ไม่มีอาร์กิวเมนต์ตำแหน่ง" แต่ควรจะเป็นxs.sort(key=lambda x: len(x))
Hi-Angel

84

เช่นเดียวกับในคำตอบของ Eli - เพียงแค่ใช้รูปแบบที่สั้นกว่าเพราะคุณสามารถข้ามlambdaส่วนที่นี่ได้

การสร้างรายการใหม่:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

การจัดเรียงในสถานที่:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

5
ฉันจะเรียงลำดับความยาวย้อนกลับได้อย่างไร
user2922935

1
@ user2922935: คุณสามารถ xs [:: - 1] เพื่อย้อนกลับรายการที่เรียงไปแล้ว ดูบทความของ Dan Bader ที่นี่: dbader.org/blog/python-reverse-list
Thyag

7
xs.sort(key=len, reverse=True)
Raz

5

ฉันต้องการเพิ่มวิธีการทำงานของฟังก์ชันคีย์ไพโธนิกขณะเรียงลำดับ:

รูปแบบการออกแบบตกแต่ง - เรียง - ไม่ตกแต่ง:

การสนับสนุนของ Python สำหรับฟังก์ชั่นสำคัญเมื่อใช้การเรียงลำดับโดยใช้สิ่งที่เรียกว่ารูปแบบการออกแบบตกแต่งจัดเรียงที่ไม่ได้ตกแต่ง

ดำเนินการใน 3 ขั้นตอน:

  1. องค์ประกอบแต่ละรายการของรายการจะถูกแทนที่ชั่วคราวด้วยเวอร์ชัน "ตกแต่ง" ซึ่งรวมถึงผลลัพธ์ของฟังก์ชันคีย์ที่ใช้กับองค์ประกอบนั้น

  2. รายการจะเรียงตามลำดับธรรมชาติของคีย์

  3. องค์ประกอบตกแต่งถูกแทนที่ด้วยองค์ประกอบดั้งเดิม

คีย์พารามิเตอร์เพื่อระบุฟังก์ชันที่จะเรียกใช้ในแต่ละองค์ประกอบรายการก่อนทำการเปรียบเทียบ เอกสาร



1

เขียนฟังก์ชัน Lensort เพื่อจัดเรียงรายการสตริงตามความยาว

def lensort(a):
    n = len(a)
    for i in range(n):
        for j in range(i+1,n):
            if len(a[i]) > len(a[j]):
                temp = a[i]
                a[i] = a[j]
                a[j] = temp
    return a
print lensort(["hello","bye","good"])

0
def lensort(list_1):
    list_2=[];list_3=[]
for i in list_1:
    list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
    list_3.append(i[0])
return list_3

สิ่งนี้ใช้ได้กับฉัน!


0

ฉันสามารถทำได้โดยใช้สองวิธีด้านล่างโดยใช้ฟังก์ชัน

def lensort(x):
    list1 = []
    for i in x:
        list1.append([len(i),i])
    return sorted(list1)

lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])

ในหนึ่ง Liner โดยใช้ Lambda ตามด้านล่างนี้มีคำตอบแล้วข้างต้น

 lista = ['a', 'bb', 'ccc', 'dddd']
 lista.sort(key = lambda x:len(x))
 print(lista)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.