Listeyi nasıl yeniden sıralayabilirim? [kapalı]


108

Listem varsa [a,b,c,d,e]öğeleri nasıl keyfi bir şekilde yeniden sıralayabilirim [d,c,a,b,e]?

Düzenleme: Onları karıştırmak istemiyorum. Onları önceden tanımlanmış bir şekilde yeniden sıralamak istiyorum. (örneğin, eski listedeki 3. öğenin yeni listedeki ilk öğe olması gerektiğini biliyorum)



4
Maddeleri nasıl sipariş etmek istediğinizi belirtmeden cevaplaması zor. Onları sıralamak ister misin? Karıştırmak mı? Bazıları kaldırılsın mı?
Mizipzor 01

@tvanfosson: Bu durumda, keyfi şu anlama da gelebilir: keyfi (ancak iyi tanımlanmış) bir sıralama işlevi almak.
Felix Kling

1
@mizipzor Onları önceden tanımlanmış bir şekilde yeniden sıralamak istiyorum. (Bunu açıklığa kavuşturmak için soruyu
Niyaz

@SilentGhost Yeni bir dizine sahip olacak. 4 olabilir. Önemli olan, öğelerin yeni sırasını bilmem.
Niyaz

Yanıtlar:


226

Bunu böyle yapabilirsin

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
Bu yeni bir değişken yaratır. Yerinde bir liste nasıl yeniden sipariş edilir? Teşekkür
Afallamış

@Confounded Son satırı şu şekilde değiştirin:mylist[:] = [mylist[i] for i in myorder]
Adam


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

@ wenlibin02, 2.7.5'in altında çalıştırdı ve hala gayet iyi çalışıyor. Bir çeşit hata mı alıyorsun?
Mark

hata yok, sadece şunu yazıyorum: 1) rastgele içe aktar; x = [1, 2, 3]; (X) random.shuffle; #it, Yok değerini döndürür; ve 2) np.random.shuffle'ı denedim. Sonuçlar aynı.
Libin Wen

Ay pardon! X'in değerini doğrudan değiştirdiğimin farkında değildim. Hiçbiri döndürmedi. Ve çalışıyor. Teşekkürler.
Libin Wen


3
>>> a=["a","b","c","d","e"]
>>> a[0],a[3] = a[3],a[0]
>>> a
['d', 'b', 'c', 'a', 'e']

2

Aşağıdakileri yapmak için kendi sıralama işlevinizi sağlayabilirsiniz list.sort():

Sort () yöntemi, karşılaştırmaları kontrol etmek için isteğe bağlı bağımsız değişkenler alır.

  • cmp ikinci bağımsız daha büyük bir negatif sıfır veya ilk değişken daha küçük olarak kabul edilmesine bağlı olarak, pozitif bir sayı dönmek eşit veya gereken iki bağımsız değişken (liste öğeleri) özel bir karşılaştırma işlevi belirtir: cmp=lambda x,y: cmp(x.lower(), y.lower()). Varsayılan değer None.

  • Anahtar belirtir her liste elemanından bir karşılaştırma anahtarı almak için kullanılan bir bağımsız değişken bir fonksiyonu: key=str.lower. Varsayılan değer None.

  • ters bir boole değeridir. True olarak ayarlanırsa, liste öğeleri her karşılaştırma tersine çevrilmiş gibi sıralanır.

Genel olarak, anahtar ve ters dönüştürme işlemleri, eşdeğer bir cmp işlevi belirlemekten çok daha hızlıdır. Bunun nedeni, cmp'nin her liste öğesi için birden çok kez çağrılması ve key ve reverse her öğeye yalnızca bir kez dokunmasıdır.


2
ve bunu tam olarak nasıl uygularsınız?
SilentGhost

@SilentGhost: Bu genel bir cevap olarak düşünülmüştür. OP durumunda cevabınız daha uygundur. Yine de genel bir çözümün var olduğunu bilmenin önemli olduğunu düşünüyorum.
Felix Kling

2

Eğer numpy kullanıyorsanız, bunu yapmanın düzgün bir yolu vardır:

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

Bu kod şunu döndürür:

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

1
OP, genel bir karıştırma değil, belirli bir yeniden sıralama arıyor.
Teepeemm

2

Verimliliği çok fazla önemsemiyorsanız, onu zarif kılmak için numpy'nin dizi indekslemesine güvenebilirsiniz:

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

1

Sorunuzdan anladığım kadarıyla, a üzerinde belirttiğiniz bir permütasyonu uygulamak istediğiniz anlaşılıyor list. Bu, permütasyonda görünmesi gereken orijinalin elemanlarının indislerini tutan başka bir list(onu çağıralım p) belirterek yapılır . Daha sonra , her konumdaki öğeyi dizini o konumda olanla değiştirerek yeni bir tane yapmak için kullanırsınız .listlistplistp

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)

Bu baskı ['d', 'c', 'a', 'b', 'e'].

Bu aslında yeni bir şey yaratır list, ancak orijinalin "yerinde" olmasına izin vermek için önemsiz bir şekilde değiştirilebilir.


1

Düşünülebilecek bir şey daha karanlıksız tarafından işaret edilen diğer yorumdur.

Python 2.7'de Kod

Esasen:

  1. Değere göre yeniden sırala - Zaten yukarıdaki AJ tarafından çözüldü
  2. Dizine göre yeniden sırala

    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]

Bu, ['c', 'd', 'b', 'a', 'e'] yazdıracak



-1

Bu sorunla karşılaştığımda kullandığım şey buydu.

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: küçük harfler için

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

Sadece listeyi belirli bir dizine kaydırır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.