2016-02-29 12 views
9

Say sayılar ve dizelerle dolu bir liste nesnesine sahibim. İlk dize öğesini en yüksek alfabetik önceliğe sahip olmak istiyorsam nasıl yaparım? İşte Alfabetik sıra numarası ile listedeki ilk öğeyi bul

açıkça yanlış bir örnektir girişimidir, ancak istenilen sonucu elde etmek için sırayla değiştirilmesi gerekir ne olduğu düzeltmeler büyük takdir:

lst = [12, 4, 2, 15, 3, 'ALLIGATOR', 'BEAR', 'ANTEATER', 'DOG', 'CAT'] 

lst.sort() 
for i in lst: 
    if i[0] == "A": 
     answer = i 
print(answer) 
+3

([i lst i için ise isinstance (i str)]) [0]'? –

+3

Bu listeyi filtrelemeden Python3'te sıralayamazsınız, çünkü 'int' ve' str' türlerini –

cevap

8

size isinstance kullanabilirsiniz IIUC sonra sorted ile alfabetik sıralamaya göre ilk elemanı almak, sadece dizeleri ile orijinal listenin alt listesini almak:

sub_lst = [i for i in lst if isinstance(i, str)] 
result = sorted(sub_lst)[0] 


print(sub_lst) 
['ALLIGATOR', 'BEAR', 'ANTEATER', 'DOG', 'CAT'] 

print(result) 
'ALLIGATOR' 

Ya @ TigerhawkT3 commen önerildiği gibi min kullanabilirsiniz t:

print(min(sub_lst)) 
'ALLIGATOR' 
+8

veya 'min()' 'sort() [0]' yerine karşılaştıramazsınız. – TigerhawkT3

+3

Not: listenin materyalleştirilmesi (sıralama için gerekli) O (N) boşluğunu gerektirir ve daha sonra sıralama O ((N log N) karşılaştırması gerektirir. Diğer taraftan, bir jeneratör ifadesinde 'min' kullanıldığında sadece O (1) boşluk gerektirir ve O (N) karşılaştırmaları –

15

İlk yüksek alfabetik varlığı ile dize seçmek için min() kullanmak sonra sigara dizeleri filtrelemek için bir generator expression kullanın ve:

>>> min(x for x in lst if isinstance(x, str)) 
'ALLIGATOR 
+0

@AntonProtopopov, "önce listeye dönüştürülen" ile ne demek istediğini bilmiyorum –

5

başka yolu da ana listesine filtre etmektir lstfilter yerleşik bir yöntem kullanılarak intergers arasından: ne 'kriteri yaklaşık

>>> min(filter(lambda s:isinstance(s, str), lst)) 
'ALLIGATOR' 
İlgili konular