[英]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是值得的:
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
將是很好的解決方案。
如果您想要這樣的東西,請嘗試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)]
是有效率的,因為它需要檢查是否i
是b
每個i
在enumerate(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.