python:单行三元运算符中列表元素的if-else

kar*_*t18 2 python ternary-operator

当我遇到以下代码时,我正在使用 python 标记化推文的代码。请注意,tokens_reemoticons_re是正则表达式对象。由于tokenize(s)返回一个列表,因此tokens是一个列表。我对 python 有点陌生,我不确定 if-else 是否在 list 的元素上运行。提到的三元运算符没有相同的语法。

def tokenize(s):
    return tokens_re.findall(s)

def preprocess(s, lowercase=False):
    tokens = tokenize(s)
    if lowercase:
        tokens = [token if emoticon_re.search(token) else token.lower() for token in tokens]
    return tokens
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

三元运算符具有相同的语法

[(token if emoticon_re.search(token) else token.lower()) for token in tokens]
#^              ternary operator expression            ^
Run Code Online (Sandbox Code Playgroud)

所以,for不是对的一部分else三元操作的一部分。该for是部分列表理解本身。

三元运算符在这里用黑体写成。在 C/C++/C#/Java 中,我们会这样写:

// Java equivalent
emoticon_re.search(token) ? token : token.lower()
Run Code Online (Sandbox Code Playgroud)

所以基本上对于列表中的每个项目,它都会应用三元运算符。列表理解等价于:

# list comprehension is equivalent to:
tmp = []
for token in tokens:
    if emoticon_re.search(token):
        tmp.append(token)
    else:
        tmp.append(token.lower())
tokens = tmp
Run Code Online (Sandbox Code Playgroud)