省略以逗号分隔的列表中的最后一个元素

时间:2010-11-28 18:56:42

标签: python django

我正在写一个标记系统。用户输入了许多标签:

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的条目?

7 个答案:

答案 0 :(得分:3)

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

使用非空字符串返回True

的事实

答案 1 :(得分:2)

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

答案 2 :(得分:1)

使用filter(),如下所示:

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

filter( f, tag_list )

答案 3 :(得分:1)

你真的想用lstrip()而不是strip()来处理标签吗?如果用户输入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

答案 4 :(得分:0)

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

将生成不带空字符的tag_list。

休息应该很简单。

答案 5 :(得分: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]

答案 6 :(得分:0)

如果你的标签实际上是在同一个变量而不是字符串列表中单独设置的,你可以选择只写:

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

无需手动解析字符串列表。