AP2*_*257 791 python list-comprehension
如何在Python中执行以下操作?
row = [unicode(x.strip()) for x in row if x is not None else '']
Run Code Online (Sandbox Code Playgroud)
实质上:
pok*_*oke 1219
你完全可以做到这一点,这只是一个订购问题:
[unicode(x.strip()) if x is not None else '' for x in row]
Run Code Online (Sandbox Code Playgroud)
请注意,这实际上使用了不同的语言构造,一个条件表达式,它本身不是理解语法的一部分,而if后面if是列表推导的一部分,用于过滤源迭代中的元素.
条件表达式可用于您希望根据某些条件在两个表达式值之间进行选择的各种情况.这与其他语言中存在的三元运算符for…in相同.例如:
[f(x) if condition else g(x) for x in sequence]
Run Code Online (Sandbox Code Playgroud)
Guz*_*ero 121
我们通过这个问题来回顾一下一些概念。我认为最好先了解基本原理,这样您就可以推断出不同的情况。
其他答案提供了您问题的具体答案。我将首先给出一些一般背景,然后我将回答这个问题。
if/else列表推导式中的语句涉及两件事:
它们提供了一种创建列表的简洁方法。
其结构包括:“括号中包含一个表达式,后跟一个 for 子句,然后是零个或多个 for 或 if 子句”。
这里我们没有条件。可迭代中的每个项目都被添加到new_list.
new_list = [expression for item in iterable]
new_list = [x for x in range(1, 10)]
> [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
这里我们有一个条件。
实施例1
条件:只有偶数才会被添加到new_list。
new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0]
> [2, 4, 6, 8]
Run Code Online (Sandbox Code Playgroud)
实施例2
条件:只有3 的倍数的偶数才会被添加到new_list。
new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0 if x % 3 == 0]
> [6]
Run Code Online (Sandbox Code Playgroud)
if但是如果我们在 中使用两个条件,为什么我们只有一个条件呢new_list?
先前的表达式可以写为:
new_list = [x for x in range(1, 10) if x % 2 and x % 3 == 0]
> [6]
Run Code Online (Sandbox Code Playgroud)
我们只使用一个if语句。
这就像做:
new_list = []
for x in range(1, 10):
if x % 2 == 0 and x % 3 == 0:
new_list.append(x)
> [6]
Run Code Online (Sandbox Code Playgroud)
实施例3
只是为了便于论证,您也可以使用or.
条件:与偶数或3的倍数相加new_list。
new_list = [x for x in range(1, 10) if x % 2 == 0 or x % 3 == 0]
> [2, 3, 4, 6, 8, 9]
Run Code Online (Sandbox Code Playgroud)
多个条件:
这里我们需要条件表达式(三元运算符)的帮助。
什么是条件表达式?顾名思义:具有某些条件的 Python 表达式。
<Exp1> if condition else <Exp2>
Run Code Online (Sandbox Code Playgroud)
首先condition进行评估。如果condition是True,则<Exp1>计算并返回。如果condition是False,则<Exp2>计算并返回。
具有多个条件的条件表达式:
<Exp1> if condition else <Exp2> if condition else <Exp3>...
Run Code Online (Sandbox Code Playgroud)
来自Real Python的示例:
age = 12
s = 'minor' if age < 21 else 'adult'
> minor
Run Code Online (Sandbox Code Playgroud)
的值s以值为条件age。
我们像这样将列表推导式和条件语句放在一起。
new_list = [<Conditional Expression> for <item> in <iterable>]
new_list = [<Exp1> if condition else <Exp2> if condition else <Exp3> for <item> in <iterable>]
Run Code Online (Sandbox Code Playgroud)
条件:偶数加为'even',三加为'number three',其余加为'odd'。
new_list = ['even' if x % 2 == 0 else 'number three' if x == 3 else 'odd'
for x in range(1, 10)]
> ['odd', 'even', 'number three', 'even', 'odd', 'even', 'odd', 'even', 'odd']
Run Code Online (Sandbox Code Playgroud)
[f(x) for x in xs if x is not None else '']
Run Code Online (Sandbox Code Playgroud)
这里我们遇到了列表结构的问题:for x in xs应该位于表达式的末尾。
正确方法:
[f(x) if x is not None else '' for x in xs]
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
Ada*_*erg 41
单程:
def change(f):
if f is None:
return unicode(f.strip())
else:
return ''
row = [change(x) for x in row]
Run Code Online (Sandbox Code Playgroud)
虽然你有:
row = map(change, row)
Run Code Online (Sandbox Code Playgroud)
或者你可以使用lambda内联.
Ben*_*ngt 37
这是另一个说明性的例子:
>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!
Run Code Online (Sandbox Code Playgroud)
它利用了这样的事实if i评估,以False对0,并True通过函数生成的所有其他值range().因此,列表理解评估如下:
>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
Run Code Online (Sandbox Code Playgroud)
Tim*_*sen 31
在以前的答案中已经解决了具体问题,因此我将讨论在列表推导中使用条件的一般概念.
这是一个示例,显示如何在列表推导中编写条件:
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
Run Code Online (Sandbox Code Playgroud)
请注意,在第一个列表理解中X_non_str,顺序是:
expression1的值, 如果是expression2
在最后的列表理解中X_str_changed,顺序是:
值1 ,如果 表达式 其他 值2 的 表达式2
我总是发现很难记住value1必须在if之前,而value2必须在else之后.我的头想要在之前或之后.
我想它的设计就是这样,因为它类似于普通语言,例如" 如果下雨,我想留在里面,否则我想去外面"
小智 22
[f(x) if x != None else '' for x in xs]
Run Code Online (Sandbox Code Playgroud)
列表理解的语法:
[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]
Run Code Online (Sandbox Code Playgroud)
其他解决方案非常适合单个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', '']
Run Code Online (Sandbox Code Playgroud)
它与列表理解的执行方式有关。
请记住以下几点:
[ expression for item in list if conditional ]
Run Code Online (Sandbox Code Playgroud)
相当于:
for item in list:
if conditional:
expression
Run Code Online (Sandbox Code Playgroud)
其中 the 的expression格式略有不同(想想在句子中切换主语和动词顺序)。
因此,您的代码[x+1 for x in l if x >= 45]执行以下操作:
for x in l:
if x >= 45:
x+1
Run Code Online (Sandbox Code Playgroud)
但是,此代码[x+1 if x >= 45 else x+5 for x in l]执行此操作(重新排列 后expression):
for x in l:
if x>=45: x+1
else: x+5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
649081 次 |
| 最近记录: |