babe = [10,11,13,'vv']
int(honey) [for honey in babe]:
print honey
当我运行这个时,我得到了语法错误。我已经尝试了很多情况。但它根本没有帮助我。对于这个愚蠢的问题。
我想在第二行添加方括号或其他内容吗?
我真的卡住了。希望你们能帮帮我......谢谢你们提前
答案 0 :(得分:1)
您似乎正在混淆for
循环的语法(一个语句后跟一系列语句......也称为"代码块")和列表理解(一个表达)。
这是列表理解:
#!/usr/bin/python
# Given:
b = [1,2,3,'vv']
a = [int(x) for x in b]
......这在句法上是有效的。但是,该示例的语义将引发异常,因为' vv'不是有效的文字(字符串)。它不能被解释为十进制整数。
这是一个for
循环:
#!/usr/bin/python
# Given:
b = [1,2,3,'vv']
a = list()
for x in b:
try:
a.append(int(x))
except ValueError:
pass
在这种情况下,我们显式循环给定列表(b
)并忽略当我们ValueError
将每个条目转换为整数时引发的任何try
异常。
没有合理的方法来处理列表理解中的异常。您可以编写一个函数,该函数返回任何无效输入值的一些标记值(来自表达式)。这看起来像这样:
#/usr/bin/python
# Given:
b = [1, 2, 3, 'vv']
def mk_integer_if_possible(n):
'''Returns an integer or the sentinel value None
'''
results = None
try:
results = int(n)
except ValueError:
pass
return results
# Use that function:
a = [mk_integer_if_possible(x) for x in b if mk_integer_if_possible(x) is not None]
注意:荒谬的函数名称是故意的。这是一种丑陋的方式来执行此操作,并且必须为b
的每个元素调用此假定函数TWICE的尴尬表明您不应该对此情况使用列表推导。 (你必须调用它一次才能进行转换,但是再次调用条件。保存一次调用的结果当然是一个STATEMENT,我们不能嵌入到EXPRESSION中。)
语句包含一个或多个表达式。表达式是语句的组成部分。 Python在语句和表达式之间严格描述。赋值是Python中的语句。这些区别可以是微妙的,并且还有其他编程语言,其中赋值是表达式而不是由语言的语法严格定义为语句。
因此,只要在迭代任何类型的数据集时处理可能的异常,并且通常需要对通过列表推导映射函数生成的结果进行过滤时,请使用for
循环。
顺便说一下,在这个例子中必须明确使用表达式is not None
。如果我试图使用Python的隐式布尔处理将该测试简化为if mk_integer_if_possible(x)
,那么我们无意中过滤掉了b
中评估为整数0的任何条目以及由我的不明智的职能作为None
哨兵返回的任何内容。
在Python中,使用隐式布尔值作为条件通常很好。 None
和False
以及任何数字零值,任何空字符串或任何类型的空列表,元组或字典都被视为" false"在布尔上下文中。但是,在处理哨兵值时,最好使用is
运算符并明确测试对象标识。否则,您的情况可能会与您的哨兵以外的其他值相匹配。
(方便的技巧:如果你曾经遇到过允许None
通过某种过滤器或传递它的需要,但你需要一些其他的哨兵......只需使用sentinel = object()
......您可以创建(实例化)通用Python object
并使用is
来匹配它以进行哨兵处理。这对您的代码和 no 其他Python对象或类型是唯一的将匹配。保证)。
顺便说一句......我应该注意到这段代码在技术上并不是只从列表中获取数字。"它返回列表中可以转换为其的所有条目的整数。这是一个挑剔;但任何优秀的工程师都会注意到它的区别。是否要从输入列表中返回所有整数?或者你想将所有条目作为整数返回,如果可以这样转换?您的代码建议您尝试完成后者;以便我如何为您实施我的工作示例。但是,要实现后面的语义,您可能想要使用(数学)加法或乘法标识属性,如下所示:
# ... from within some function:
try:
results = x == x + 0 # Additive identity
except (TypeError, ValueError):
results = None
return results
答案 1 :(得分:0)
babe = [10,11,13,'vv']
a = [honey for honey in babe if isinstance(honey, int)]
print a
在此处详细了解列表理解:https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions