Python 在列表中的多个索引处设置项
我试图找到一种方法,使用索引列表在列表中的多个位置设置值(numpy数组也是如此) 我发现我可以映射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
\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)。