2016-03-28 33 views
-2

Farklı isimler listem var. Listeden isimleri basan bir senaryom var.Regexp uygulayarak en yüksek sayıyı bulur.

req=urllib2.Request('http://some.api.com/') 
req.add_header('AUTHORIZATION', 'Token token=hash') 
response = urllib2.urlopen(req).read() 
json_content = json.loads(response) 
for name in json_content: 
    print name['name'] 

Çıktı:

Thomas001 
Thomas002 
Alice001 
Ben001 
Thomas120 

isminden Thomas ile birlikte gelen maksimum sayısını bulmak gerekiyor. "Thomas" ı içeren tüm öğeler için regexp uygulamasının basit bir yolu var mı ve sonra onlara max (liste) uygulansın mı? Geldiğim tek yol, listedeki her öğeyi incelemek, Thomas için regexp'i eşleştirmek, sonra mektupları soymak ve kalan sayıları yeni bir listeye koymak ama bu oldukça hantal bir şey.

cevap

2

Düzenli ifadelere ihtiyacınız yoktur ve sıralamaya ihtiyacınız yoktur. Dediğin gibi, max() iyi.

names = ((x['name'][:6], x['name'][6:]) for x in json_content) 
max(int(b) for a, b in names if a == 'Thomas' and b.isdigit()) 

ilk atama bir jeneratör ifade oluşturur, böylece maksimum bulmak için dizinin üzerinde yalnızca bir geçiş olacak: listesi "Thomasson123" gibi adlarını içeren durumunda güvenli olması için, kullanabilirsiniz.

+0

Şerefe, sanırım bununla bir çıkış yolu yapacağım. Eğer çözümünüzü uygularsam, "Thomas" ile başlayan en yüksek sayı 100'ün üzerinde olmasına rağmen beni "9" basar. –

+0

@SarunasUrbelis Sayıların sıfır doldurulduğunu varsaydım. En fazla çekmeden önce dizge dizgisi düzeltilecek, güncellenmiş cevaba bakınız. – arekolek

2

Düzenli ifadelere gerek yok. Sadece sonuçları bir listede saklayın ve bunun üzerine sorted işlevini uygulayın.

>>> l = ['Thomas001', 
'homas002', 
'Alice001', 
'Ben001', 
'Thomas120'] 
>>> [i for i in sorted(l) if i.startswith('Thomas')][-1] 
'Thomas120'