Python 在列表中的多个索引处设置项

Python 在列表中的多个索引处设置项,python,map-function,Python,Map Function,我试图找到一种方法,使用索引列表在列表中的多个位置设置值(numpy数组也是如此) 我发现我可以映射\uuu getitem\uuu和一个索引列表,以返回这些索引处的值: # something like a_list = ['a', 'b', 'c'] idxs = [0, 1] get_map = map(a_list.__getitem__, idxs) print(list(get_map)) # yields ['a', 'b'] 但是,当将同样的思路应用于\uuuuu seti

我试图找到一种方法,使用索引列表在列表中的多个位置设置值(numpy数组也是如此)

我发现我可以映射
\uuu getitem\uuu
和一个索引列表,以返回这些索引处的值:

# something like
a_list = ['a', 'b', 'c']
idxs = [0, 1]
get_map = map(a_list.__getitem__, idxs) 

print(list(get_map)) # yields ['a', 'b']
但是,当将同样的思路应用于
\uuuuu setitem\uuuu
时,设置失败。这可能与通过引用传递与通过值传递有关,我从来没有完全理解过这一点,无论我读了多少次

有没有办法做到这一点?

b_list = ['a', 'b', 'c']
idxs = [0, 1]
put_map = map(b_list.__setitem__, idx, ['YAY', 'YAY'])

print(b_list) # yields ['YAY', 'YAY', 'c']
对于我的用例,我只想在多个位置设置一个值。在多个位置没有多个值


编辑:我知道如何使用列表理解。我试图模仿
numpy
的功能,即接受数组中获取和设置项的索引列表,但列表除外。

get
set
案例之间的区别在于,在
get
案例中,您对
map
本身的结果感兴趣,但是在
设置
的情况下,您需要一个副作用。因此,您永远不会使用
map
生成器,指令也永远不会实际执行。一旦您这样做,
b_列表
将按预期进行更改

>>> put_map = map(b_list.__setitem__, idxs, ['YAY', 'YAY']) 
>>> b_list                                                                  
['a', 'b', 'c']
>>> list(put_map)                                                           
[None, None]
>>> b_list                                                                 
['YAY', 'YAY', 'c']
话虽如此,
get
的正确方法是列表理解,而
set
的正确方法是简单的
for
循环。这还有一个优点,即您不必重复该值以放置n次

>>> for i in idxs: b_list[i] = "YAY"                                       
>>> [b_list[i] for i in idxs]                                              
['YAY', 'YAY']

@mkrieger1最后一个示例不起作用。它不会产生任何结果,
b_list
保持不变。我只是想举一个我想要实现的例子。你从不使用地图,因此指令不会执行。试试
list(put\u map)
,它只会产生
[None,None]
,但之后
b\u list
就如预期的那样了。@mkrieger1,我想没有什么。我只是觉得使用map可能会更快。为什么
dictionary
被用作标记?@tobias_k啊!好吧,我明白你的意思了!好的,唯一麻烦的是,如果我在多个位置有一个值,我必须列出
['Yay','Yay',,…,'Yay']
。但我想那还不错。谢谢。
map
不会比列表理解快吗?我只是想知道,因为numpy允许这种操作,尽管我不知道它是如何实现的。我不认为
map
比列表理解快。但是,在性能测试中,只测试
映射
创建(如您所做的)而不实际评估/使用映射,这是一个常见的陷阱,因此它比等效的列表理解要快得多。我的意思是,对于列表理解,您必须迭代最多N个项。但是对于映射,您只需迭代您想要获取/设置的特定索引。我想这是大计划中的一个小差异?无论如何,我会接受你的回答,并询问另一个关于NumPy如何实现此功能的问题。不,请注意,如果我在idxs中,我没有对范围内的I(len(b_list))执行
[b_list[I]
,而是对idxs中的I执行
[b_list[I]
,因此我只迭代我想要的索引。对于循环的
也是如此。Numpy可能会有一些性能优化,但最终对于n个元素列表中的k个索引来说是O(k)。