จัดเรียง tuples ตามพารามิเตอร์ที่สอง


94

ฉันมีรายการสิ่งที่มีลักษณะดังนี้:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

สิ่งที่ฉันต้องการสร้างคือรายการที่เรียงลำดับจากน้อยไปมากตามค่าที่สองของทูเปิล ดังนั้น L [0] ควรอยู่("Person 2", 8)หลังการจัดเรียง

ฉันจะทำเช่นนี้ได้อย่างไร? ใช้ Python 3.2.2 ถ้าช่วยได้


คำตอบ:


188

คุณสามารถใช้keyพารามิเตอร์เพื่อlist.sort():

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

หรือเร็วกว่าเล็กน้อย

my_list.sort(key=operator.itemgetter(1))

(เช่นเดียวกับโมดูลอื่น ๆ คุณจะต้องimport operatorสามารถใช้งานได้)


3
ฉันได้ลองใช้L.sort(key=operator.itemgetter(1))ในรหัสของฉัน แต่ได้รับ NameError ซึ่งไม่ได้กำหนด 'ตัวดำเนินการ' ฉันต้องนำเข้าอะไรเป็นพิเศษหรือไม่?
user974703

3
ทำการค้นหาเล็กน้อยจำเป็นต้องใช้import operatorเพื่อใช้ฟังก์ชัน หากคุณเพิ่มคำตอบนั้นฉันจะทำเครื่องหมายว่ายอมรับ
user974703

การทดสอบด้วย timeit.timeit (ตัวเลือกเริ่มต้น) ไม่มีความแตกต่างกันมากระหว่างสองวิธีนี้: operator.itemgetter = 1.05µs, lambda = 1.25µs ต่อการวนซ้ำ
Noel Evans

ขอบคุณสำหรับโซลูชัน my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice

1
หากคุณเพิ่งเริ่มใช้คีย์เวิร์ด lambda: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx

12

และถ้าคุณใช้ python 3.X คุณสามารถใช้sortedฟังก์ชันนี้ในmylist นี่เป็นเพียงส่วนเสริมของคำตอบที่ทาง @Sven Marnach ให้ไว้ข้างต้น

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

นี่เป็นเพียงบิวท์อินที่ส่งคืนรายการใหม่ คำตอบของคุณไม่ได้มีส่วนร่วมอะไรกับคนที่นี่แล้วมันเป็นที่ชัดเจนว่าหากคุณต้องการรายการใหม่ที่คุณจะใช้แทนsorted list.sort
miradulo

2
@SamuelNde ฉันเลื่อนลงมาที่นี่เพราะฉันไม่แน่ใจว่านิพจน์ทำงานเหมือนกันสำหรับการเรียงลำดับหรือไม่ดังนั้นมันจึงช่วยฉันได้
Red Riding Hood

เห็นด้วยนี่ช่วยฉันด้วย
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

เอาต์พุต -> Rogue One


ความคิดสองสามข้อ: สิ่งนี้ไม่ได้ตอบคำถามจริง ๆ (วิธีรับรายการเรียงตามค่าในทูเปิล) คุณสามารถแกะทูเปิลได้โดยตรงในลูปของคุณ (สำหรับภาพยนตร์ค่าใน listoftuples:); คุณได้แทนที่ประเภท 'tuple'; และสามารถทำได้จริงคือการทำความเข้าใจรายการเดียว: (return sorted ((value, movie) for movie, value in listoftuples) [- 1] [1])
RFox

ฉันซาบซึ้งในสิ่งที่คุณกำลังทำ แต่ฉันขอยืนยันว่ามันขาดความสง่างามและควรปรับปรุงได้ โดยทั่วไปแล้วจะถือว่าเป็นการปฏิบัติที่ไม่ดีในการเปลี่ยนลำดับขององค์ประกอบในกระจุกแบบนี้ ฉันคิดว่าประเด็นเกี่ยวกับความเข้าใจในรายการและการเปิดกล่องจะยังคงมีอยู่ และฉันจะกีดกันทุกคนที่ใช้วิธีการนี้มากกว่าคำตอบที่ยอมรับ
RFox

ฉันไม่สามารถใช้งานได้และไม่สามารถรับรหัสที่คุณโพสต์ไปใช้งานได้ซึ่งน่าจะเป็นข้อผิดพลาดของผู้ใช้
Darrell White

แต่เปลี่ยนไปเล็กน้อยและไม่ต้องสงสัยเลยว่าคำตอบของคุณดีขึ้น 200 เท่า
Darrell White

def findMaxSales (listoftuples): newlist = sorted ((value, movies) สำหรับภาพยนตร์, value in listoftuples) return newlist [-1] [1] movieList = [("Finding Dory", 486), ("Captain America: Civil War ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" The Secret Life of Pets ", 368), (" Batman v Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] พิมพ์ (findMaxSales (movieList))
Darrell White
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.