我从表单文本字段中获取 new_tag
self.response.get("new_tag")
和 selected_tags
从复选框字段中获取
self.response.get_all("selected_tags")
我这样组合它们:
tag_string = new_tag
new_tag_list = f1.striplist(tag_string.split(",") + selected_tags)
( f1.striplist
是一个去除列表中字符串内空格的函数。)
But in the case that tag_list
is empty (no new tags are entered) but there are some selected_tags
, new_tag_list
contains an empty string " "
。
例如,来自 logging.info
:
new_tag
selected_tags[u'Hello', u'Cool', u'Glam']
new_tag_list[u'', u'Hello', u'Cool', u'Glam']
如何摆脱空字符串?
如果列表中有一个空字符串:
>>> s = [u'', u'Hello', u'Cool', u'Glam']
>>> i = s.index("")
>>> del s[i]
>>> s
[u'Hello', u'Cool', u'Glam']
但是如果没有空字符串:
>>> s = [u'Hello', u'Cool', u'Glam']
>>> if s.index(""):
i = s.index("")
del s[i]
else:
print "new_tag_list has no empty string"
但这给出了:
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
if new_tag_list.index(""):
ValueError: list.index(x): x not in list
为什么会发生这种情况,我该如何解决?
原文由 Zeynel 发布,翻译遵循 CC BY-SA 4.0 许可协议
1)几乎是英文风格:
使用
in
运算符测试是否存在,然后应用remove
方法。The
remove
method will remove only the first occurrence ofthing
, in order to remove all occurrences you can usewhile
instead ofif
.2) 鸭型, EAFP 风格:
这种先拍后问的态度在 Python 中很常见。无需提前测试对象是否合适,只需执行操作并捕获相关异常:
当然,上面示例中的第二个 except 子句不仅幽默有问题,而且完全没有必要(重点是为不熟悉该概念的人说明鸭子类型)。
如果您期望事物多次出现:
但是,使用 contextlib 的 suppress() contextmanager (在 python 3.4 中引入),上面的代码可以简化为:
同样,如果您期望事物多次出现:
3)功能风格:
Around 1993, Python got
lambda
,reduce()
,filter()
andmap()
, courtesy of a Lisp hacker who missed them and submitted working patches* .您可以使用filter
从列表中删除元素:有一个快捷方式可能对您的情况有用:如果您想过滤掉空项目(实际上是
bool(item) == False
的项目,例如None
、零、空字符串或其他空集合), 你可以传递 None 作为第一个参数:filter(function, iterable)
used to be equivalent to[item for item in iterable if function(item)]
(or[item for item in iterable if item]
if the first argument isNone
);在 Python 3.x 中,它现在等同于(item for item in iterable if function(item))
。细微的区别是过滤器用于返回一个列表,现在它像一个生成器表达式一样工作——如果你只是迭代清理过的列表并丢弃它,这是可以的,但如果你真的需要一个列表,你必须把filter()
调用list()
构造函数。filter
- along with companionsmap
andreduce
(they are not gone yet butreduce
was移入 functools 模块,如果你喜欢 高阶函数,值得一看)。4)数学风格:
自从 PEP 202 在 2.0 版中引入以来, 列表理解 成为 Python 中列表操作的首选样式。其背后的基本原理是,列表理解提供了一种更简洁的方法来在当前使用
map()
和filter()
和/或嵌套循环的情况下创建列表。生成器表达式由 PEP 289 在 2.4 版中引入。生成器表达式更适用于您不需要(或不想)在内存中创建完整列表的情况——比如您只想一次迭代一个元素。如果您只是遍历列表,您可以将生成器表达式视为 惰性评估 列表理解:
笔记
!=
而不是is not
( 区别很重要)