如果一个项目可能不在列表中,我们还可以做if-else来检查条件吗?

问题描述:

假设我们有如果一个项目可能不在列表中,我们还可以做if-else来检查条件吗?

mystr = 'hello.py' 
mystr = 'hello' 
if not 'py' in mystr.rsplit('.')[1]: 

第一种情况是好的,但第二种情况导致一个“超出范围”的错误。

目标:

如果存在的.py字符串中,什么也不做。如果.py不是文件名的一部分,请执行XYZ。 注意:用户输入可能有或没有'.extension-type'。

尝试:

要么检查长度,或列表转换成一个字符串。

还可以吗?我不确定这是否太本地化。就是想。

谢谢。

+3

那么“foo.py.txt”呢? – 2012-01-17 04:25:36

+0

@ IgnacioVazquez-Abrams这是一个很棒的评论。我简单地忽略了这样的情况。 – CppLearner 2012-01-17 04:28:08

我干脆写

if not mystr.endswith('.py'): 

(假设,当然,我已经明白你的意图。)

+0

谢谢。伊格纳西奥拉着我简直被忽视的状况。但是,您的解决方案仍然非常好。是。我想找到最终的类型。 – CppLearner 2012-01-17 04:29:16

为什么不利用str.rfind?

mystr = 'hello.py' 
index = mystr.rfind('.py') 
if index > 0: #found, do something 
else: #not found, do something else 
+0

哦。我总是忘记这些方法。谢谢。 – CppLearner 2012-01-17 04:30:11

+0

@CppLearner没问题。我忘记了哪些是最好的解决方案。 – Yuushi 2012-01-17 04:34:14

为什么你不能检查它?

if '.py' in mystr: 
    # do foo 
else: 
    # do bar 

但是,如果我理解正确你,这应该更好地工作:

if '.py' in os.path.splitext(mystr)[0]: 
    # do foo 
else: 
    # do bar 

os.path.splitext()拆分成文件名的文件名和扩展名。

+0

[1],不是[0],不是? – DSM 2012-01-17 04:36:38

+0

我不确定OP是否在讨论文件名中存在的扩展名(这就是我回答的原因,您的答案包含我的第二个想法)或实际扩展名。 OP从未回答@ Ignacio的问题。 – Blender 2012-01-17 04:39:03

+0

是的。理想情况下这应该工作。不幸的是,这个设计非常糟糕,我只是在阅读一个字符串而已。肯定会使用这个(顺便说一下,我正在开发一个系统级项目,所以它很有用!)非常感谢Blender。 – CppLearner 2012-01-17 06:35:46

您可以使用posixpath模块来查找文件的扩展名:

>>> import posixpath 
>>> posixpath.splitext('hello.py')[1] 
'.py' 
>>> posixpath.splitext('hello')[1] 
'' 
>>> posixpath.splitext('hello.py.txt')[1] 
'.txt' 
>>> posixpath.splitext('.ssh')[1] 
'' 
+0

将其添加到我的工具箱中...很好。 – kindall 2012-01-17 06:06:32

if ".py" in os.path.splitext(mystr)[-1]: 
    # do 

os.path.splitext(myStr中)[ - 1]会抢在 “最后一个” 元素名单。 如果只有一个元素,它将返回那个元素。

所以这个不会抛出OutofRange异常。 另外,os.path.splitext()将始终返回两个对象。

我建议你不要忽视刑事未充分利用的partitionrpartition方法。好处是,即使您没有找到正在分割的文本,您总是会得到一个三元组。

partitioned = mystr.rpartition(".") 
if partitioned[1] and partitioned[2] == "py": 
    # do something