ฉันจะจัดลำดับรายการใหม่ได้อย่างไร? [ปิด]


108

หากฉันมีรายการ[a,b,c,d,e]ฉันจะเรียงลำดับรายการใหม่โดยพลการได้[d,c,a,b,e]อย่างไร?

แก้ไข: ฉันไม่ต้องการสับเปลี่ยน ฉันต้องการสั่งซื้อใหม่ในลักษณะที่กำหนดไว้ล่วงหน้า (ตัวอย่างเช่นฉันรู้ว่าองค์ประกอบที่ 3 ในรายการเก่าควรกลายเป็นองค์ประกอบแรกในรายการใหม่)


น่าจะซ้ำกับstackoverflow.com/questions/976882/…
kgiannakakis

4
โดยไม่ต้องระบุว่าคุณต้องการสั่งซื้อสินค้าอย่างไรมันยากที่จะตอบ คุณต้องการจัดเรียงหรือไม่ สุ่มเพลง? ลบบางส่วนออกไหม
Mizipzor

@tvanfosson: ในกรณีนี้ arbitrary อาจหมายถึง: ใช้ฟังก์ชันการจัดเรียงตามอำเภอใจ (แต่กำหนดไว้อย่างดี)
Felix Kling

1
@mizipzor ฉันต้องการสั่งซื้อใหม่ด้วยวิธีที่กำหนดไว้ล่วงหน้า (แก้ไขคำถามเพื่อชี้แจงเรื่องนี้)
Niyaz

@SilentGhost มันจะมีดัชนีใหม่ อาจจะ 4 ประเด็นคือฉันรู้ลำดับใหม่ของรายการ
Niyaz

คำตอบ:


226

คุณสามารถทำได้เช่นนี้

mylist = ['a', 'b', 'c', 'd', 'e']
myorder = [3, 2, 0, 1, 4]
mylist = [mylist[i] for i in myorder]
print(mylist)         # prints: ['d', 'c', 'a', 'b', 'e']

1
สิ่งนี้จะสร้างตัวแปรใหม่ จะสั่งซื้อรายการใหม่ได้อย่างไร? ขอบคุณ
สับสน

@Confounded เพียงแค่เปลี่ยนบรรทัดสุดท้ายเป็น:mylist[:] = [mylist[i] for i in myorder]
อดัม

13
>>> a = [1, 2, 3]
>>> a[0], a[2] = a[2], a[0]
>>> a
[3, 2, 1]

1
ฉันไม่สามารถเข้าใจไวยากรณ์จนฉันตระหนักคือการกำหนดพร้อมกันคู่ ´:-)
loved.by.Jesus

11
>>> import random
>>> x = [1,2,3,4,5]
>>> random.shuffle(x)
>>> x
[5, 2, 4, 3, 1]

@ wenlibin02 เพียงแค่วิ่งต่ำกว่า 2.7.5 และยังใช้งานได้ดี คุณได้รับข้อผิดพลาดบางอย่างหรือไม่?
ทำเครื่องหมาย

ไม่มีข้อผิดพลาดฉันแค่พิมพ์: 1) นำเข้าแบบสุ่ม x = [1, 2, 3]; สุ่ม. สับ (x); # มันกลับไม่มี; และ 2) ฉันลองใช้ np.random.shuffle ผลลัพธ์จะเหมือนกัน
Libin Wen

โอ้ขอโทษ! ฉันไม่รู้ว่าฉันเปลี่ยนค่าของ x โดยตรง มันกลับไม่มี และมันได้ผล ขอบคุณ.
Libin Wen

6

ลำดับสุดท้ายถูกกำหนดโดยรายการดัชนีหรือไม่?

>>> items = [1, None, "chicken", int]
>>> order = [3, 0, 1, 2]

>>> ordered_list = [items[i] for i in order]
>>> ordered_list
[<type 'int'>, 1, None, 'chicken']

แก้ไข: meh. AJ เร็วขึ้น ... ฉันจะเรียงลำดับรายการใน python ได้อย่างไร?



2

คุณสามารถจัดเรียงฟังก์ชันของคุณเองเพื่อlist.sort():

วิธีการ sort () ใช้อาร์กิวเมนต์ที่เป็นทางเลือกในการควบคุมการเปรียบเทียบ

  • cmpระบุฟังก์ชั่นการเปรียบเทียบที่กำหนดเองของทั้งสองมีปากเสียง (รายการ) cmp=lambda x,y: cmp(x.lower(), y.lower())ซึ่งควรจะกลับมาเป็นเชิงลบเป็นศูนย์หรือจำนวนบวกขึ้นอยู่กับว่าอาร์กิวเมนต์แรกถือว่ามีขนาดเล็กกว่าเท่ากับหรือใหญ่กว่าอาร์กิวเมนต์ที่สอง: Noneค่าเริ่มต้นคือ

  • ที่สำคัญkey=str.lowerระบุเป็นหน้าที่ของอาร์กิวเมนต์หนึ่งที่ใช้ในการดึงคีย์เปรียบเทียบจากองค์ประกอบแต่ละรายการ: Noneค่าเริ่มต้นคือ

  • ย้อนกลับเป็นค่าบูลีน หากตั้งค่าเป็น True องค์ประกอบรายการจะถูกจัดเรียงราวกับว่าการเปรียบเทียบแต่ละรายการกลับกัน

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


2
และคุณจะใช้สิ่งนี้อย่างไร?
SilentGhost

@SilentGhost: นี่คือคำตอบทั่วไป ในกรณี OPs คำตอบของคุณเหมาะสมกว่า อย่างไรก็ตามฉันคิดว่าสิ่งสำคัญคือต้องรู้ว่ามีโซลูชันทั่วไปอยู่
Felix Kling

2

หากคุณใช้ numpy มีวิธีการที่เรียบร้อย:

items = np.array(["a","b","c","d"])
indices = np.arange(items.shape[0])
np.random.shuffle(indices)
print(indices)
print(items[indices])

รหัสนี้ส่งคืน:

[1 3 2 0]
['b' 'd' 'c' 'a']

1
OP กำลังมองหาการเรียงลำดับใหม่ที่เฉพาะเจาะจงไม่ใช่การสับแบบทั่วไป
Teepeemm

2

หากคุณไม่สนใจเรื่องประสิทธิภาพมากนักคุณสามารถพึ่งพาการจัดทำดัชนีอาร์เรย์ของ numpy เพื่อทำให้มันดูหรูหรา

a = ['123', 'abc', 456]
order = [2, 0, 1]
a2 = list( np.array(a, dtype=object)[order] )

1

จากสิ่งที่ฉันเข้าใจคำถามของคุณดูเหมือนว่าคุณต้องการใช้การเปลี่ยนแปลงที่คุณระบุในไฟล์list. สิ่งนี้ทำได้โดยการระบุอีกอันหนึ่งlist(เรียกมันpว่า) ที่เก็บดัชนีขององค์ประกอบของต้นฉบับlistที่ควรปรากฏในการlistอนุญาต จากนั้นคุณใช้pเพื่อสร้างใหม่listโดยเพียงแค่แทนที่องค์ประกอบในแต่ละตำแหน่งโดยดัชนีที่อยู่ในตำแหน่งpนั้น

def apply_permutation(lst, p):
    return [lst[x] for x in p]

arr=list("abcde")
new_order=[3,2,0,1,4]

print apply_permutation(arr,new_order)

['d', 'c', 'a', 'b', 'e']พิมพ์นี้

สิ่งนี้จะสร้างใหม่listแต่สามารถแก้ไขได้เล็กน้อยเพื่อให้ "อยู่ในตำแหน่ง" เดิม


1

อีกสิ่งหนึ่งที่สามารถพิจารณาได้คือการตีความอื่น ๆ ที่ชี้ให้เห็นโดย Darkless

รหัสใน Python 2.7

ส่วนใหญ่:

  1. จัดลำดับใหม่ตามค่า - แก้ไขแล้วโดย AJ ด้านบน
  2. จัดลำดับใหม่ตามดัชนี

    mylist = ['a', 'b', 'c', 'd', 'e']
    myorder = [3, 2, 0, 1, 4]
    
    mylist = sorted(zip(mylist, myorder), key=lambda x: x[1])
    print [item[0] for item in mylist]

สิ่งนี้จะพิมพ์ ['c', 'd', 'b', 'a', 'e']



-1

นี่คือสิ่งที่ฉันใช้เมื่อฉันสะดุดกับปัญหานี้

def order(list_item, i): # reorder at index i
    order_at = list_item.index(i)
    ordered_list = list_item[order_at:] + list_item[:order_at]
    return ordered_list

EX: สำหรับตัวอักษรพิมพ์เล็ก

order(string.ascii_lowercase, 'h'):
>>> 'hijklmnopqrstuvwxyzabcdefg'

เพียงแค่เลื่อนรายการไปยังดัชนีที่ระบุ

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