Bir dizi listesi sayısal olarak nasıl sıralanır?


128

Bunun önemsiz geldiğini biliyorum, ancak sort()Python'un işlevinin tuhaf olduğunu fark etmedim . Aslında dize biçiminde olan bir "sayılar" listem var, bu yüzden önce onları tamsaya dönüştürüyorum, sonra bir sıralama yapmaya çalışıyorum.

list1=["1","10","3","22","23","4","2","200"]
for item in list1:
    item=int(item)

list1.sort()
print list1

Bana verir:

['1', '10', '2', '200', '22', '23', '3', '4']

İstediğim şey

['1','2','3','4','10','22','23','200']

Sayısal kümeleri sıralamakla ilgili bazı algoritmaları araştırdım, ancak bulduklarımın tümü alfanümerik kümeleri sıralamayı içeriyor.

Bunun muhtemelen akıllıca bir sorun olmadığını biliyorum, ancak google ve ders kitabım .sort()işlevden daha fazla veya daha az yararlı bir şey sunmuyor .


9
For döngünüzün düşündüğünüzden şüphelendiğim şeyi yapmadığını unutmayın.
deinst

1
Hiçbir zaman güncelleme yapmadınız list1. listGüncellenmekte olduğunu düşündüren nedir ?
S.Lott

List1 = ['1', '1.10', '1.11', '1.1', '1.2'] girdi olarak sağlandığında benzer sorun yükselir. ['1', '1.1', '1.2', '1.10', '1.11'] olarak çıktı almak yerine ['1', '1.1', '1.10', '1.11', '1.2' alıyorum ]
sathish

2
python 3'te kullanmak isteyebilirsinizsorted(mylist)
Akin Hwan

Yanıtlar:


191

Aslında dizelerinizi tamsayılara dönüştürmediniz. Daha doğrusu yaptınız ama sonuçlarla hiçbir şey yapmadınız. İstediğin şey:

list1 = ["1","10","3","22","23","4","2","200"]
list1 = [int(x) for x in list1]
list1.sort()

Herhangi bir nedenden ötürü tamsayılar yerine dizeleri tutmanız gerekiyorsa (genellikle kötü bir fikir, ancak baştaki sıfırları veya başka bir şeyi korumanız gerekebilir), bir anahtar işlevi kullanabilirsiniz . , karşılaştırılmadan önce her öğede çağrılan bir işlev olan sortadlandırılmış bir parametre alır key. Liste öğelerini doğrudan karşılaştırmak yerine anahtar işlevin dönüş değerleri karşılaştırılır:

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)

8
2.7'de key = int denediğimde Hiçbiri
alıyorum

1
Bu, liste elemanı "tamsayı" olarak saklanırsa çalışır, float değerleri durumunda nasıl ele alınır? Ör., List1 = [1, 1.10, 1.11, 1.1, 1.2]
sathish

1
@ KI4JGT sıralama yöntemi listeyi değiştirir ve Yok döndürür. Bunun yerine list1 = list1.sort(key=int), sadece kullanın list1.sort(key=int)ve list1 zaten sıralanacaktır.
Josiah Yoder

1
@ KI4JGT .sort () yerinde bir operatördür, Hiçbiri döndürür, listeyi sıralar, sıralı () kullanmak isteyebilirsiniz
sherpya

39

Sen bir fonksiyon geçebileceği keyiçin parametre yöntemine . Bununla, sistem x yerine (x) anahtarına göre sıralayacaktır..sort

list1.sort(key=int)

BTW, listeyi kalıcı olarak tamsayılara dönüştürmek için işlevi kullanınmap

list1 = list(map(int, list1))   # you don't need to call list() in Python 2.x

veya listeyi anlama

list1 = [int(x) for x in list1]

21

sorted()Fonksiyonu kullanmak istemeniz durumunda :sorted(list1, key=int)

Yeni bir sıralanmış liste döndürür.


1
Setlerle de çalışır!
MT

12

Python'un durumu tuhaf değil. Sadece bu kod:

for item in list1:
   item=int(item)

sandığınız şeyi yapmıyor - itemlisteye geri alınmıyor, basitçe atılıyor.

Her neyse, doğru çözüm key=intbaşkalarının size gösterdiği gibi kullanmaktır .


12

Ayrıca kullanabilirsiniz:

import re

def sort_human(l):
    convert = lambda text: float(text) if text.isdigit() else text
    alphanum = lambda key: [convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key)]
    l.sort(key=alphanum)
    return l

Bu, internette bulabileceğiniz diğer şeylere çok benzer, ancak aynı zamanda alfanümerikler için de işe yarar [abc0.1, abc0.2, ...].


9

Dün aynı soruna yaklaştım ve sorununuzu çözen [natsort] [1] adlı bir modül buldum. kullanın:

from natsort import natsorted # pip install natsort

# Example list of strings
a = ['1', '10', '2', '3', '11']

[In]  sorted(a)
[Out] ['1', '10', '11', '2', '3']

[In]  natsorted(a)
[Out] ['1', '2', '3', '10', '11']

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

Eşdeğeri olarak sözlükler için de çalışır sorted. [1]: https://pypi.org/project/natsort/


8

Seamus Campbell'ın cevabı python2.x üzerinde çalışmıyor. işlevi
list1 = sorted(list1, key=lambda e: int(e))kullanmak lambdaiyi çalışıyor.


3

Bunu deneyin, listeyi azalan sırada yerinde sıralayacaktır (bu durumda bir anahtar belirtmeye gerek yoktur):

süreç

listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9]
listC = sorted(listB, reverse=True) # listB remains untouched
print listC

çıktı:

 [48, 46, 25, 24, 22, 13, 8, -9, -15, -36]

0

En son çözüm doğrudur. Çözümleri bir dizge olarak okuyorsunuz, bu durumda sıra 1, sonra 100, sonra 104, ardından 2, sonra 21, sonra 2001001010, 3 ve benzeridir.

Bunun yerine girişinizi bir int olarak CAST yapmalısınız:

sıralı dizeler:

stringList = (1, 10, 2, 21, 3)

sıralı ints:

intList = (1, 2, 3, 10, 21)

Yayınlamak için stringList'i int (blahblah) içine koyun.

Tekrar:

stringList = (1, 10, 2, 21, 3)

newList = int (stringList)

print newList

=> returns (1, 2, 3, 10, 21) 

1
TypeError: int () bağımsız değişkeni bir dize veya sayı olmalıdır, 'tuple' değil
Cees Timmerman

Ayrıca stringList'inizdeki dizelerin tırnak işaretleri olmalıdır.
Teepeemm


0

Numaraların dizelerini kullanmak istiyorsanız, kodumda gösterildiği gibi başka bir liste alsanız iyi olur.

list1=["1","10","3","22","23","4","2","200"]

k=[]    
for item in list1:    
    k.append(int(item))

k.sort()
print(k)
# [1, 2, 3, 4, 10, 22, 23, 200]

0

Sayısal bir listeyi sıralamanın basit yolu

numlists = ["5","50","7","51","87","97","53"]
results = list(map(int, numlists))
results.sort(reverse=False)
print(results)

-1

gerçek sorun, bu sıralamanın her şeyi alfasayısal olarak sıralamasıdır. Yani bir listeniz ['1', '2', '10', '19'] varsa ve sıralamayı çalıştırırsanız ['1', '10' elde edersiniz. "19", "2"]. Yani 10, 2'den önce gelir çünkü ilk karaktere bakar ve bundan başlayarak sıralar. Görünüşe göre python'daki çoğu yöntem, şeyleri bu sırayla döndürür. Örneğin, 1.jpg, 2.jpg vb. Olarak etiketlenmiş dosyalara sahip abc adında bir dizininiz varsa ve en fazla 15.jpg derseniz ve file_list = os.listdir (abc) yaparsanız, file_list beklediğiniz gibi değil, file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Dosyaların işlenme sırası önemliyse (muhtemelen bu yüzden onları sayısal olarak adlandırdınız) sıra, düşündüğünüz gibi değildir. Bunu, "sıfır" dolgusu kullanarak önleyebilirsiniz. Örneğin, bir listeniz varsa alist = ['01', '03', '05', '10', '02', '04', '06] ve üzerinde sıralama çalıştırırsanız, istediğiniz sırayı alırsınız. alist = ['01', '02' vb.] çünkü ilk karakter 1'den önce gelen 0'dır. İhtiyacınız olan sıfır dolgusu miktarı listedeki en büyük değere göre belirlenir. Örneğin en büyüğü 100 ile 100 arasında ise 1000, 001, 002 --- 010,011-100, 101 vb. Şeklinde tek haneleri doldurmanız gerekir.


-5
scores = ['91','89','87','86','85']
scores.sort()
print (scores)

Bu, sürüm 2'de olmasa da, python sürüm 3 kullanarak benim için çalıştı.


3
Orada '11 ve '100' ile sıralamayı deneyin, işte o zaman işler ilginçleşir.
Penz
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.