如果作为三元运算符python

时间:2016-01-22 00:41:55

标签: python if-statement ternary-operator

我正在尝试使用此功能(运行):

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")

尽可能地简化它。具体来说,我试图在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语句时我不断收到一些随机语法错误。如果我对“true”条件情况做一个更简单的操作,或者如果我关闭了else,那么我仍然会得到一个错误,这意味着python在“if”条件下遇到了问题。

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

谢谢!

3 个答案:

答案 0 :(得分:1)

您不能将break与三元运算符一起使用。如果我理解你的函数(它绕着它找到的第一个char实例旋转),那么为什么不简单地实现:

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

答案 1 :(得分: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)

答案 2 :(得分:0)

您的问题是使用break作为三元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)):
        if string[i] == a[0]: break
        final.append(string[i]) or final.pop(0) if string[i] != a[0] else False
    print(final)
shift_on_character("zipfian", "f")

这是有效的,因为你并没有真正使用表达式的结果而只是依赖于它的副作用。一般来说,这不是一个好习惯,我会保留你以前的原始表达。