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

set item at multiple indexes in a list

我正在尝试找到一种方法来使用索引列表在列表中的多个位置设置值(使用 numpy 数组是可能的)。

我发现我可以将 __getitem__ 和索引列表映射到 return 这些索引处的值:

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

print(list(get_map)) # yields ['a', 'b']

然而,当将同样的思路应用到__setitem__时,设置失败了。这可能与按引用传递与按值传递有关,无论我读过多少次,我都没有完全理解它。

有办法吗?

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 接受索引列表以获取和设置数组中项目的能力,列表除外。

getset 情况的区别在于,在 get 情况下,您对 map 本身的结果感兴趣,而在 set 如果你想要副作用。因此,您永远不会使用 map 生成器,并且永远不会实际执行指令。完成后,b_list 会按预期进行更改。

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