2016-03-28 16 views
-2

Ich habe eine Liste mit verschiedenen Namen. Ich habe ein Skript, das die Namen aus der Liste ausdruckt.Regexp anwenden und die höchste Nummer in einer Liste finden

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'] 

Ausgang:

Thomas001 
Thomas002 
Alice001 
Ben001 
Thomas120 

Ich brauche die maximale Anzahl zu finden, die Thomas mit dem Namen kommt. Gibt es eine einfache Möglichkeit, Regexp für alle Elemente, die "Thomas" enthalten, anzuwenden und dann Max (Liste) auf sie anzuwenden? Der einzige Weg, den ich mir ausgedacht habe, ist, jedes Element in der Liste durchzugehen, Regexp für Thomas anzupassen, dann die Buchstaben zu strippen und die restlichen Zahlen in eine neue Liste zu setzen, aber das scheint ziemlich umfangreich zu sein.

Antwort

2

Sie brauchen keine regulären Ausdrücke, und Sie brauchen keine Sortierung. Wie Sie gesagt haben, ist max() in Ordnung. Um sicher zu sein, falls die Liste enthält Namen wie „Thomasson123“ können Sie verwenden:

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()) 

Die erste Aufgabe, einen Generator Ausdruck schafft, so wird es nur ein Durchlauf über die Folge sein, das Maximum zu finden.

+0

Prost, ich denke, ich werde mich damit heraus arbeiten. Obwohl wenn ich Ihre Lösung anwende, druckt es mich "9" aus, obwohl die höchste Zahl, die mit "Thomas" beginnt, weit über 100 ist. –

+0

@SarunasUrbelis Ich nahm an, dass die Zahlen Null-gefüllt waren. Wenn Sie String vor der Maximierung auf int setzen, wird das behoben, siehe aktualisierte Antwort. – arekolek

2

Sie müssen nicht für Regex gehen. Speichern Sie die Ergebnisse einfach in einer Liste und wenden Sie dann die Funktion sorted darauf an.

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