2010-11-28 9 views
3

Ich schreibe ein Tagging-System. Der Benutzer gibt eine Reihe von Tags:Das letzte Element in der kommagetrennten Liste auslassen

abc, def, ghi, 

Aber wenn sie ein Komma verwenden, denkt, dass der Code gibt es 4-Tags, nicht drei.

In meinem Code, ich schreibe:

if "tags" in request.POST: 
    tags = request.POST["tags"] 
    tag_list = [Tag.objects.get_or_create(name = tag.lstrip())[0] for tag in tags.split(",")] 

Einen Tag '' in diesem Fall erstellt wird. Wie kann ich den Code ändern, um irgendeinen Eintrag zu ignorieren, der ich nehme len (str) = 0?

Antwort

2
for tag in tags.split(",") if tag.strip() 
+0

Der Streifen nicht zu mutieren, ist Methode, so dass Sie immer noch das Leerzeichen auf dem Tag haben. – dietbuddha

0
tag_list = [tag.lstrip() for tag in tags.split(",") if len(tag.lstrip())>0] 

die tag_list ohne das leere Zeichen erzeugen.

Rest sollte einfach sein.

1

Verwenden filter(), etwa so:

def f(x): return x != '' 

filter(f, tag_list) 
+0

ist vielleicht besser ein Lambda da – Ant

3
>>> x = "first, second, third," 
>>> y = [ele for ele in x.split(',') if ele] 
>>> y 
['first', ' second', ' third'] 

Mit der Tatsache, dass die nicht leere Strings True zurückzukehren.

0

Sie können alle tun, um Ihre tags Verarbeitung in einmal Platz, so dass Sie sich nicht zu Anruf tag.lstrip() innen get_or_create(name = ...):

if "tags" in request.POST: 
    tags = request.POST["tags"] 
    tags = (tag.lstrip() for tag in tags.split(',') if tag.strip()) 
    tag_list = [Tag.objects.get_or_create(name = tag)[0] for tag in tags] 
0

Wenn Ihre Tags tatsächlich einzeln in der gleichen Variable statt als Set String-Liste haben Sie die Möglichkeit, nur zu schreiben:

filter(len, map(str.strip, request.POST.getlist("keys"))) 

Ohne eine String-Liste manuell analysieren zu müssen.

1

Möchten Sie wirklich lstrip() anstelle von strip() zur Verarbeitung der Tags verwenden? Was passiert, wenn der Benutzer abc , def eingibt? Möchten Sie wirklich ein Tag "abc " mit einem nachgestellten Leerzeichen zulassen?

Wenn Sie wirklich auf beiden Seiten die Tags wollen Streifen (was ich denke, Sie tun), dann ist es eine einfache Sache, das zu tun, und dann die leere Weglassen:

try: # EAFP 
    tags = (tag.strip() for tag in request.POST['tags'].split(',')) 
    tag_list = [Tag.objects.get_or_create(name = tag)[0] for tag in tags if tag] 
    # 'if tag' is the operative "filtering" bit 
except KeyError: pass 
Verwandte Themen