python列表理解不起作用

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)

谁能看到这里发生了什么?

谢谢!

Joh*_*024 7

使用列表理解

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值得它的盐,将是这个"

正如你所说,导入一个模块和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将是很好的解决方案.