Python逻辑或操作符表现奇怪

时间:2012-04-22 12:14:44

标签: python for-loop arraylist operators boolean

我正在尝试使用一行for for循环中包含扩展名images'.png''.jpg'的文件填充名为'jpeg'的列表。我通过使用逻辑or运算符尝试了这一点,但只导致了一个空列表。

images = [i for i in os.listdir('.') if i[-4:] == ('.png' or '.jpg' or 'jpeg')]

如何查看'.png''.jpg''jpeg'是文件的最后4个字符,同时将它们全部保存在一行for循环中?

6 个答案:

答案 0 :(得分:3)

其他答案建议在此处使用in,但您可能更喜欢使用str.endswith()方法:

extensions = '.png', '.jpg', '.jpeg'
images = [i for i in os.listdir('.') if i.endswith(extensions)]

这样做的好处是你不必在.jpeg上捏造匹配:你可以检查任何长度的扩展名(甚至将列表存储在与其余代码分开的地方),而不必担心关于破坏代码,如果有任何更短或更长的代码。

答案 1 :(得分:2)

使用in运算符:

images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]

更好的是,不要只检查最后4个字符,而是使用os.path.splitext()

images = [i for i in os.listdir('.') if os.path.splitext(i)[1] in ('.png', '.jpg', '.jpeg')]

如果你想知道为什么你的代码不起作用:('.png' or '.jpg' or 'jpeg') == '.png'因为它是第一个不是假的值。

答案 2 :(得分:2)

正如您所写,python评估('.png' or '.jpg' or 'jpeg'),并将i[-4:]与结果进行比较。

你可能想要的是@ThiefMaster建议:in运算符。

答案 3 :(得分:1)

您可以使用fnmatch模块来实现此目的。

>>> extensions = ['*.jpg','*.png','*.jpeg']
>>> [file for file in os.listdir(".") for ext in extensions if fnmatch.fnmatch(file,ext)]
['1.png', '2.jpg', '3.jpeg']

答案 4 :(得分:0)

表达式('.png'或'.jpg'或'jpeg')实际上首先被评估为'.png',并且可能没有达到预期的效果。

您可以尝试:

images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]

答案 5 :(得分:0)

使用or是一个布尔表达式,用于检查表达式中的任何值是否计算为True

i[-4:] == ('.png' or '.jpg' or 'jpeg')

评估i[-4:]是否等于:

('.png' or '.jpg' or 'jpeg') 

检查每个值是否为True并返回第一个True值或最后一个值(如果没有True值。在这种情况下,它们都评估为True,因为只有空字符串计算为False,因此'.png'是表达式的结果。

您可以通过执行

来解决此问题
[i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]

或者更好的方式

[i for i in os.listdir('.') if os.path.splitext(i)[1] in ('.png','.jpg','.jpeg')]