วิธีการเรียงลำดับรายการตามดัชนีเฉพาะของรายการภายในได้อย่างไร


234

ฉันมีรายการของรายการ ตัวอย่างเช่น,

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

ถ้าฉันต้องการเรียงลำดับรายการภายนอกโดยเขตข้อมูลสตริงของรายการภายในคุณจะทำเช่นนั้นในหลามได้อย่างไร


6
ลิงก์ไปยังบทช่วยสอน: wiki.python.org/moin/HowTo/Sorting
Felix Kling

3
ลิงค์ที่มีประโยชน์: stackoverflow.com/questions/18142090/…
dot.Py

คำตอบ:


321

นี่คืองานสำหรับitemgetter

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

นอกจากนี้ยังเป็นไปได้ที่จะใช้ฟังก์ชั่นแลมบ์ดาที่นี่ แต่ฟังก์ชั่นแลมบ์ดาจะช้าลงในกรณีง่าย ๆ นี้


จะทำอย่างไรถ้าฉันต้องการเพิกเฉยต่อกรณีและปัญหา
bzupnick

5
@bzupnick key=lambda x:x[2].casefold()ใช้ หาก Python ของคุณยังใหม่ไม่พอให้ใช้.lower()แทน.casefold()
John La Rooy

x = [[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] ด้วยรายการแบบนี้สามารถ เราจัดเรียงโดยใช้ itemgetter () เกี่ยวกับองค์ประกอบใน x [0] [1]?
nidHi

ฉันสามารถรับดัชนีการเรียงลำดับเพื่อเรียงลำดับรายการที่เกี่ยวข้องอื่นในลำดับเดียวกันได้หรือไม่
quarky

@quaryk ฟังดูเหมือนคำถามที่น่าสนใจ แต่ไม่เหมาะที่จะตอบในความคิดเห็น หากคุณไม่พบคำถามที่ครอบคลุมคุณควรสร้างคำถามขึ้นมา
John La Rooy

175

ในสถานที่

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

ไม่ได้อยู่ในสถานที่โดยใช้การเรียงลำดับ:

>>> sorted(l, key=lambda x: x[2])

4
คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับin placeและnot in place?
qun

9
@qun, "in place" หมายความว่าหน่วยความจำของรายการเก่าจะถูกนำมาใช้ใหม่สำหรับการเรียงลำดับ "ไม่เข้าที่" หมายความว่ารายการเก่ายังคงไม่เปลี่ยนแปลงและสร้างรายการใหม่
John La Rooy

x = [[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4.89], [[5,1], 5.97]] ด้วยรายการเช่นนี้คือ เราจะจัดเรียงองค์ประกอบด้วยความเคารพใน x [0] [1] ได้อย่างไร?
nidHi

81

Itemgetter ช่วยให้คุณสามารถจัดเรียงตามเกณฑ์ / คอลัมน์หลายรายการ:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
ฉันคิดว่าคำตอบนี้สำคัญมาก ฉันคิดว่าคนที่พยายามเรียงลำดับตามดัชนีอาเรย์ภายในจะอยู่ที่นี่ แต่คนที่ต้องการเรียงลำดับตามดัชนีภายในอาเรย์หลายตัวจะเริ่มต้นที่นี่และคำตอบของคุณช่วยให้ฉันเห็นว่าไอเท็มของคุณจะทำสิ่งนั้นให้คุณ!
ZekeDroid


10
array.sort(key = lambda x:x[1])

คุณสามารถเรียงลำดับโดยใช้ตัวอย่างนี้โดยที่ 1 คือดัชนีขององค์ประกอบ



8

ฉันคิดว่าฟังก์ชั่นแลมบ์ดาสามารถแก้ปัญหาของคุณได้

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

ถูกต้องฉันถ้าฉันผิด แต่ไม่ใช่ 'x [2]' เรียกรายการที่ 3 ในรายการไม่ใช่รายการที่ 3 ในรายการซ้อนหรือไม่ ควรเป็น x [2] [2]?


ไม่เพราะคีย์ / แลมบ์ดาวนซ้ำรายการในรายการระดับแรกแล้ว x เป็นตัวแปรท้องถิ่นที่ถูกผูกไว้กับแต่ละรายการในทางกลับกัน
DragonLord

1

ง่ายต่อการเข้าใจ (แลมบ์ดากำลังทำอะไรอยู่):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

0

การเรียงลำดับอาร์เรย์หลายมิติดำเนินการที่นี่

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.