2010-11-28 11 views
3

나는 태깅 시스템을 작성 중이다. 사용자가 여러 태그를 입력합니다.쉼표로 구분 된 목록의 마지막 요소 생략.

abc, def, ghi, 

그러나 꼬리표를 사용하면 코드에 3이 아닌 4 개의 태그가 있다고 생각합니다. 내 코드에서

, 나는 쓰기 :

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 
관련 문제