Python 是否可以使用';其他';在列表中?

Python 是否可以使用';其他';在列表中?,python,list-comprehension,Python,List Comprehension,以下是我试图将代码转换为列表理解的代码: table = '' for index in xrange(256): if index in ords_to_keep: table += chr(index) else: table += replace_with >>> {i for i in "set comprehension"} {'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', '

以下是我试图将代码转换为列表理解的代码:

table = ''
for index in xrange(256):
    if index in ords_to_keep:
        table += chr(index)
    else:
        table += replace_with
>>> {i for i in "set comprehension"}
{'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', 'e', 's', ' '}
>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{'key': 'value', 'dict': 'comprehension'}
有没有办法将else语句添加到此理解中

table = ''.join(chr(index) for index in xrange(15) if index in ords_to_keep)

如果您想要一个
else
,您不想过滤列表,您希望它迭代每个值。如果cond else false value,则可以使用
true value作为语句,并从末尾删除筛选器:

table = ''.join(chr(index) if index in ords_to_keep else replace_with for index in xrange(15))

语法
a if b else c
是Python中的三元运算符,如果条件
b
为true,则其计算结果为
a
,否则,其计算结果为
c
。它可用于理解陈述:

>>> [a if a else 2 for a in [0,1,0,3]]
[2, 1, 2, 3]
以你为例

table = ''.join(chr(index) if index in ords_to_keep else replace_with
                for index in xrange(15))
此外,我得出的结论是否正确:理解列表是最有效的方法

也许吧。列表理解在计算上并非天生高效。它仍然以线性时间运行

根据我个人的经验:
在处理大型数据集时,我将列表理解(特别是嵌套的)替换为上面的for循环/列表附加类型结构,从而大大减少了计算时间。在这个应用程序中,我怀疑您是否会注意到差异。

要在python编程中使用列表理解中的
else
,您可以尝试下面的代码片段。这将解决您的问题,该代码段在Python2.7和Python3.5上进行了测试

obj = ["Even" if i%2==0 else "Odd" for i in range(10)]

答案很好,但我只想提一个问题,即“pass”关键字在列表理解的if/else部分不起作用(如上面提到的示例所示)

这在Python3.4上进行了尝试和测试。 错误如下:

newlist2 = [x if x > 30 else pass for x in list1 ]                                    
SyntaxError: invalid syntax

因此,尽量避免在列表理解中使用pass-es

Yes
否则
可以在Python中与(“三元运算符”)一起使用:

这里,括号“()”只是强调条件表达式,它们不一定是必需的()

此外,可以嵌套多个表达式,从而导致更多的
else
s和更难读取的代码:

>>> ["A" if b=="e" else "d" if True else "x" for b in "comprehension"]
['d', 'd', 'd', 'd', 'd', 'A', 'd', 'A', 'd', 'd', 'd', 'd', 'd']
>>>
在相关注释中,理解也可以包含其自身的
(如果
条件)结尾:

>>> ["A" if b=="e" else "c" for b in "comprehension" if False]
[]
>>> ["A" if b=="e" else "c" for b in "comprehension" if "comprehension".index(b)%2]
['c', 'c', 'A', 'A', 'c', 'c']
条件s?是的,如果可能出现多个
,实际上也有多个
用于
s:

>>> [i for i in range(3) for _ in range(3)]
[0, 0, 0, 1, 1, 1, 2, 2, 2]
>>> [i for i in range(3) if i for _ in range(3) if _ if True if True]
[1, 1, 2, 2]
(在Python中,单下划线
\uu
是一个有效的变量名(),这里使用它只是为了表明它没有实际使用。它有一个

可以将其用于其他条件表达式,但没有实际用途:

>>> [i for i in range(3)]
[0, 1, 2]
>>> [i for i in range(3) if i]
[1, 2]
>>> [i for i in range(3) if (True if i else False)]
[1, 2]
也可以嵌套理解以创建“多维”列表(“数组”):


最后但并非最不重要的一点是,理解不限于创建
列表
,即
else
if
也可以在理解中以相同的方式使用:

table = ''
for index in xrange(256):
    if index in ords_to_keep:
        table += chr(index)
    else:
        table += replace_with
>>> {i for i in "set comprehension"}
{'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', 'e', 's', ' '}
>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{'key': 'value', 'dict': 'comprehension'}
还有一个理解:

table = ''
for index in xrange(256):
    if index in ords_to_keep:
        table += chr(index)
    else:
        table += replace_with
>>> {i for i in "set comprehension"}
{'o', 'p', 'm', 'n', 'c', 'r', 'i', 't', 'h', 'e', 's', ' '}
>>> {k:v for k,v in [("key","value"), ("dict","comprehension")]}
{'key': 'value', 'dict': 'comprehension'}
同样的语法也用于:

可用于创建
元组
()


进一步阅读:


woops,我的意思是询问关于连接方法与字符串上的+=的比较。有趣。这()则相反。@Josh:在较旧版本的Python中,join()方法有着极大的优越性。较新版本的解释器试图优化+=方法,但我不确定这是否有效。我几乎总是使用join()方法。请注意,这只适用于Python 2.5及更高版本。还请注意,
else
是必需的,并且不能使用,因为结果值始终是必需的。join()中的代码在没有括号的情况下是列表理解吗?或者是生成器表达式和join将其作为参数就可以了?@huggie这是一个生成器表达式,
join
愉快地使用生成器或任何其他iterable。Docs:至于列表理解,if/else构造只是一个表达式。如果您想省去项目,您需要在这里将表达式替换为
expr2
[expr1 If expr2中的x的expr1]
Well pass在正常的If-else块中工作,对我来说,这意味着它在其他任何地方都可以工作。但在列表理解中并非如此。但这不是一个正常的if/else块。是的。你也不能在那里用elif。