Python 列表中的if/else
如何在Python中执行以下操作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] 并且,对
row = [unicode(x.strip()) for x in row if x is not None else '']
基本上:
你完全可以做到。这只是一个订购问题:
[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条件或正常表达式