Bal*_*sar 0 python list-comprehension for-comprehension
我有这个非常简单的问题:我需要为列表b中的每个索引将列表a中的值设置为1:
>>> a=[0, 0, 0, 0]
>>> b=[1, 3]
Run Code Online (Sandbox Code Playgroud)
那么期望的结果是:
[0, 1, 0, 1]
Run Code Online (Sandbox Code Playgroud)
优雅的解决方案,如果python值得它的盐,当然是这样的:
>>> a[b]=1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not list
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用......所以我尝试了以下列表推导,但它们都产生了相同的错误,就好像理解是导致它(在for上):
首先是我真正希望工作的简单版本:
>>> a[x for x in b] = 1
File "<stdin>", line 1
a[x for x in b] = 1
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
然后是稍微复杂的版本:
>>> a[b[x] for x in range(0,len(b))] = 1
File "<stdin>", line 1
a[b[x] for x in range(0,len(b))] = 1
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
谁能看到这里发生了什么?
谢谢!
In [1]: a=[0, 0, 0, 0]
In [2]: b=[1, 3]
In [3]: [ 1 if i in b else a_i for i, a_i in enumerate(a) ]
Out[3]: [0, 1, 0, 1]
Run Code Online (Sandbox Code Playgroud)
正如你所说,导入一个模块和python是值得的:
In [1]: from numpy import array
In [2]: a = array([0, 0, 0, 0])
In [3]: b = [1, 3]
In [4]: a[b] = 1
In [5]: a
Out[5]: array([0, 1, 0, 1])
Run Code Online (Sandbox Code Playgroud)
对于处理大量数据,numpy既优雅又快速.如果不使用numpy,那么Jonathan Hartnagel的for循环或类似Joel Cornett的东西BellsAndWhistlesList将是很好的解决方案.