2010-11-28 7 views
3

タグ付けシステムを作成しています。ユーザーは、タグの数に入る:カンマ区切りリストの最後の要素を省略します。

abc, def, ghi, 

をしかし、彼らは末尾にカンマを使用する場合、コードは4個のタグではなく、3があると考えています。私のコードで

、私が書く:

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(",")] 

タグ '' この例で作成されます。 len(str)= 0と思われるエントリを無視するようにコードを変更するにはどうすればよいですか?

答えて

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

ストリップが変異ではありませんメソッドを使用すると、まだタグに空白があります。 – dietbuddha

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

空の文字なしtag_listを生成します。

その他は簡単です。そのような

1

使用フィルタ()、:

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

filter(f, tag_list) 
+0

おそらくそこのラムダです – Ant

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

非空の文字列がTrueを返すという事実を使用。

0

あなたは場所に一度にすべてのtags処理を行うことができますので、あなたが持っていない コールtag.lstrip()から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

あなたのタグが実際との代わりに、同じ変数に個別に設定されている場合文字列リストを作成することができます。

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

手動で文字列リストを解析する必要はありません。

1

実際にタグを処理するのにstrip()ではなくlstrip()を使用しますか?ユーザーがabc , defと入力した場合はどうなりますか?あなたは本当に末尾のスペースでタグ"abc "を許可したいですか?

あなたは本当に(私はあなたがそう思う)、両側のタグを削除したい場合は、それはそれをやった後、空のものを省略する簡単な問題だ:

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 
関連する問題