2016-01-22 132 views
0

我想利用这个功能(运行):如果作为三元操作蟒蛇

def shift_on_character(string, char): 
    final = list(string) 
    a = [i for index, i in enumerate(string) if i.lower() == char.lower()] 
    for i in range(0,len(string)): 
     if string[i] != a[0]: 
      final.append(string[i]) 
      final.pop(0) 
     else: break 
    print(final) 
shift_on_character("zipfian", "f") 

,简化IT尽可能地。具体来说,我试图在if语句中使用三元运算符来将该部分缩短为一行代码。 我想写:

def shift_on_character(string, char): 
    final = list(string) 
    a = [i for index, i in enumerate(string) if i.lower() == char.lower()] 
    for i in range(0,len(string)): 
     final.append(string[i]) & final.pop(0) if string[i] != a[0] else break 
    print(final) 
shift_on_character("zipfian", "f") 

但我不断收到一些随机的语法错误简化if语句时。如果我为“真实”情况做了一个更简单的操作,或者如果我把它关闭了,我仍然会得到一个错误,这意味着python在“if”条件下遇到了问题。

发生了什么,我该如何解决?

谢谢!

+0

您不能对三元运算符使用'break'。 – donkopotamus

回答

1

您不能与三元运算符一起使用break。如果我理解你的函数(各地焦炭找到的第一个实例旋转),那么为什么不执行只是为:

def shift_on_character(string, char): 
    try: 
     pos = string.index(char) 
     return string[pos:] + string[:pos] 
    except IndexError: 
     # what do you want to do if char is not in string?? 
     return string 
+0

感谢您的帮助! –

0

你的问题是使用break作为三元if的一部分。如果你真的想,如果用三元,你可以做这样的:

这工作,因为你并没有真正使用表达式的结果,只是依靠它的副作用。一般来说,这不是一个好的做法,我会保留原来的表达方式。

+0

这个解决方案给出了一个类型错误(TypeError:不支持的操作数类型为&:'NoneType'和'str') –

+0

是的,我意识到我已经把'&'放在那里,并且改成'or' ,它适用于None类型。不过,@ donkopotamus的解决方案要好得多。 –

1

它会更简单(而且相当快一点)使用Python的内置函数:

def shift_on_character(string, char): 
    try: 
     index = string.lower().index(char.lower()) 
     string = string[index:] + string[:index] 
    except ValueError: 
     pass 
    return list(string)