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

3

我正在编写一个标签系统。用户输入一些标签:

abc, def, ghi,

但是如果他们使用尾随逗号,代码会认为有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(",")]

在这种情况下创建了一个 ' ' 标签。我该如何修改代码以忽略任何长度为0的输入?
7个回答

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

利用非空字符串返回True的事实。


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

strip()方法不会改变原字符串,因此标签上仍然会保留空格。 - dietbuddha

1
使用filter()函数,如下所示:
def f(x): return x != ''

filter( f, tag_list )

或许在那儿使用一个 Lambda 会更好。 - Ant

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

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

将生成不包含空字符的标签列表。

其余部分应该很简单。


0

你可以在一个地方处理所有的tags,这样你就不必在get_or_create(name = ...)内部调用tag.lstrip()

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接