簡體   English   中英

python列表理解不起作用

[英]python list comprehension not working

我有一個非常簡單的問題:我需要將列表b中每個索引的列表a中的值設置為1:

>>> a=[0, 0, 0, 0]
>>> b=[1, 3]

所需的結果將是:

[0, 1, 0, 1]

如果python值得一試,那么優雅的解決方案當然是這樣的:

>>> a[b]=1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not list

但是當然那是行不通的...所以我嘗試了以下列表推導,但是它們都產生相同的錯誤,就像推導引起了(在for上):

首先,我真正希望的是簡單版本:

>>> a[x for x in b] = 1
  File "<stdin>", line 1
    a[x for x in b] = 1
          ^
SyntaxError: invalid syntax

然后是稍微復雜一點的版本:

>>> 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

任何人都可以看到這里發生了什么嗎?

謝謝!

使用列表理解

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]

“如果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])

對於處理大量數據, numpy既優雅又快速。 如果不使用numpy ,那么Jonathan Hartnagel的for循環或類似Joel Cornett的BellsAndWhistlesList將是很好的解決方案。

有什么問題:

for i in b:
    a[i] = 1

或者,按照@ John1024的建議,使用numpy

from numpy import array
a[b] = 1

如果您想要這樣的東西,請嘗試numpy:

In [1]: import numpy

In [2]: a = numpy.zeros(4)

In [3]: b = numpy.array((1, 3))

In [4]: a[b] = 1

In [5]: a
Out[5]: array([ 0.,  1.,  0.,  1.])

或像這樣的普通Python解決方案:

a = [0] * 4
b = [1, 3]
for i in b:
    a[i] = 1

另一種方法(緩慢且低效):

a = [0] * 4
b = [1, 3]
a = [i in b and 1 or a_i for i, a_i in enumerate(a)]

使用列表理解:

a = [1 if i in b else v for i,v in enumerate(a) ]

輸出:

[0, 1, 0, 1]
[x for x in b] 

將創建:

[1, 3]

因此您的代碼將如下所示:

a[1,3] = 1

哪個無效。

我不會為此使用列表推導,您可以簡單地:

for i in b:
    a[i] = 1

我不認為[1 if i in b else v for i,v in enumerate(a)]是有效率的,因為它需要檢查是否ib每個ienumerate(a)

正如其他答案所說, for i in b: a[i] = 1是最簡單有效的方法,它只是直接設置需要的值。

但是,如果您不想使用for循環,則可以使用另一種方法來使用map而不是將map應用於列表的所有元素。 該工具將為每個元素引入一個函數調用,因此可能效率也不高。

>>> a=[0,0,0,0]
>>> b=[1,3]
>>> import functools
>>> def set_index(x, l):
...     l[x] = 1
...
>>> mapfunc = functools.partial(set_index, l=a)
>>> map(mapfunc, b)
[None, None]
>>> a
[0, 1, 0, 1]

只是踢:

class BellsAndWhistlesList(list):
    def __setitem__(self, key, value):
        if hasattr(key, "__iter__") or hasattr(key, "next"):
            for i, v in zip(key, value):
                super(BellsAndWhistlesList, self).__setitem__(i, v)
        else:
            super(BellsAndWhistlesList, self).__setitem__(key, value)

這個怎么樣:

a = [0,0,0,0]
b = [1,3]

for i in range(len(b)):
    a[b[i]] = 1

print a # [0, 1, 0, 1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM