Python 列表中的if/else

Python 列表中的if/else,python,list-comprehension,Python,List Comprehension,如何在Python中执行以下操作 row = [unicode(x.strip()) for x in row if x is not None else ''] 基本上: 用空字符串替换所有Nones,然后 执行一项功能 你完全可以做到。这只是一个订购问题: [unicode(x.strip()) if x is not None else '' for x in row] 总的来说 [f(x) if condition else g(x) for x in sequence] 并且,对

如何在Python中执行以下操作

row = [unicode(x.strip()) for x in row if x is not None else '']
基本上:

  • 用空字符串替换所有Nones,然后
  • 执行一项功能

  • 你完全可以做到。这只是一个订购问题:

    [unicode(x.strip()) if x is not None else '' for x in row]
    
    总的来说

    [f(x) if condition else g(x) for x in sequence]
    
    并且,对于仅具有
    if
    条件的列表理解

    [f(x) for x in sequence if condition]
    
    请注意,这实际上使用了不同的语言构造a,a本身不是的一部分,而
    if
    后面的
    for…in
    是列表理解的一部分,用于从源iterable中筛选元素


    条件表达式可以在各种情况下使用,您需要根据某些条件在两个表达式值之间进行选择。这样做的效果与。例如:

    value = 123
    print(value, 'is', 'even' if value % 2 == 0 else 'odd')
    
    单向:

    def change(f):
        if f is None:
            return unicode(f.strip())
        else:
            return ''
    
    row = [change(x) for x in row]
    
    尽管你有:

    row = map(change, row)
    

    或者您可以使用lambda内联。

    这里是另一个示例:

    >>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
    Ha, ha, ha!
    
    它利用了这样一个事实:对于
    0
    ,如果i的计算结果为
    False
    ,对于函数
    range()
    生成的所有其他值,则为
    True
    。因此,列表理解评估如下:

    >>> ["ha" if i else "Ha" for i in range(3)]
    ['Ha', 'ha', 'ha']
    

    具体的问题在前面的回答中已经解决了,所以我将讨论在列表理解中使用条件句的一般想法

    下面是一个示例,说明如何在列表中编写条件:

    X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list
    
    # Extract non-strings from X to new list
    X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning
    
    # Change all strings in X to 'b', preserve everything else as is
    X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end
    
     ps = PorterStemmer()
     stop_words_english = stopwords.words('english')
     best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
     bestwords = set([w for w, s in best])
    
    
     def best_word_feats(words):
       return dict([(word, True) for word in words if word in bestwords])
    
     # with stemmer
     def best_word_feats_stem(words):
       return dict([(ps.stem(word), True) for word in words if word in bestwords])
    
     # with stemmer and not stopwords
     def best_word_feats_stem_stop(words):
       return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])
    
    请注意,在
    X_non_str
    的第一个列表理解中,顺序为:

    在iterableif条件下项的表达式

    在上一个列表中,
    X_str__changed
    ,顺序是:

    表达式1如果条件其他表达式2对于中的

    我总是很难记住,expression1必须在if之前,expression2必须在else之后。我的脑袋想两者都在之前或之后

    我猜它是这样设计的,因为它类似于正常的语言,例如,“如果下雨,我想呆在屋里,否则我想出去”

    用通俗易懂的英语上述两种列表理解可以表述为:

    仅在以下情况下使用

    如果
    苹果成熟,则在
    苹果盒中为苹果提取苹果

    并使用
    if/else

    如果苹果已成熟,则标记苹果,否则将苹果置于苹果框中,不标记苹果


    其他解决方案对于单个
    if
    /
    else
    构造非常有用。然而,列表理解中的三元语句可能很难阅读

    使用函数有助于可读性,但在映射为输入的工作流中,这种解决方案很难扩展或适应。词典可以缓解这些担忧:

    row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]
    
    d = {None: '', 'filler': 'manipulated'}
    
    res = [d.get(x, x) for x in row]
    
    print(res)
    
    ['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']
    
    (venv)$python列表\u comp.py
    附加我的清单[0,1,2,3,4,5]
    附加我的结果列表[0,5,4,7,8,9]

    所以,对你来说:
    行=[(“”,unicode(x.strip())[x不是无]表示行中的x]

    不需要三元if/then/else。我认为你的问题需要这样的回答:

    row=[unicode((x或“”).strip())表示行中的x]
    
    从iterable中的项目制作列表

    似乎最好先概括所有可能的形式,而不是给出问题的具体答案。否则,读者将不知道答案是如何确定的。在我头痛之前,我想到了一些通用的形式,试图决定最后一种形式是否可以使用else子句

    [expression1(item)                                        for item in iterable]
    
    [expression1(item) if conditional1                        for item in iterable]
    
    [expression1(item) if conditional1 else expression2(item) for item in iterable]
    
    [expression1(item) if conditional1 else expression2(item) for item in iterable if conditional2]
    
    item
    的值不需要在任何条件子句中使用。
    conditional3
    可用作向输出列表添加或不添加值的开关

    例如,要创建从原始字符串列表中删除空字符串或空白字符串的新列表,请执行以下操作:

    newlist = [s for s in firstlist if s.strip()]
    

    它与列表理解的执行方式有关

    请记住以下几点:

    [ expression for item in list if conditional ]
    
    相当于:

    for item in list:
        if conditional:
            expression
    
    其中,
    表达式
    的格式稍有不同(考虑在句子中切换主语和动词顺序)

    因此,您的代码
    [x+1表示l中的x,如果x>=45]
    执行以下操作:

    for x in l:
        if x >= 45:
            x+1
    
    但是,此代码
    [x+1如果x>=45,则x+5表示l中的x]
    执行此操作(在重新排列
    表达式之后):


    您可以在理解中组合条件逻辑:

    X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list
    
    # Extract non-strings from X to new list
    X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning
    
    # Change all strings in X to 'b', preserve everything else as is
    X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end
    
     ps = PorterStemmer()
     stop_words_english = stopwords.words('english')
     best = sorted(word_scores.items(), key=lambda x: x[1], reverse=True)[:10000]
     bestwords = set([w for w, s in best])
    
    
     def best_word_feats(words):
       return dict([(word, True) for word in words if word in bestwords])
    
     # with stemmer
     def best_word_feats_stem(words):
       return dict([(ps.stem(word), True) for word in words if word in bestwords])
    
     # with stemmer and not stopwords
     def best_word_feats_stem_stop(words):
       return dict([(ps.stem(word), True) for word in words if word in bestwords and word not in stop_words_english])
    
    你可以这样做

    row = [unicode(x.strip()) if x != None else '' for x in row]
    
    列表理解的一些语法:

    [item if condition else item for item in items]
    [f(item) if condition else value for item in items]
    [item if condition for item in items]
    [value if condition else value1 if condition1 else value2]
    

    请注意这里的if/else现在是“三元运算符”语法,而不是列表理解语法。这就是为什么我更喜欢将三元运算符放在括号中,这更清楚地表明它只是一个普通表达式,而不是理解。所以诀窍是“在列表压缩中,我写if之前,然后我还必须添加else部分”。因为如果我的
    l=[2,3,4,5]
    那么
    [x如果x%2==0表示l中的x]
    给我一个错误,而
    [x如果x%2==0表示l中的x]
    工作正常。是的,我知道要过滤它,我应该写
    [x代表x,如果x%2==0]
    。对不起打扰了。谢谢你的回答。请注意,它需要else,否则不起作用。@Drewdin列表理解不支持在迭代期间中断。然后,您必须使用普通循环。当您必须处理来自
    if
    表达式或its或
    else
    s语句块中的代码的可能异常时,这也是一种很好的(可能是唯一的)方法。对于简单的情况,接受的答案更好。第二个答案的可能重复给出了一个错误,正如Tim在评论中所说的,另请参见python文档中的。我看不懂。小结:只有
    此if条件或正常表达式