在列表中的多个索引处设置项目
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
接受索引列表以获取和设置数组中项目的能力,列表除外。
get
和 set
情况的区别在于,在 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']
我正在尝试找到一种方法来使用索引列表在列表中的多个位置设置值(使用 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
接受索引列表以获取和设置数组中项目的能力,列表除外。
get
和 set
情况的区别在于,在 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']