我有一个清单:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
Run Code Online (Sandbox Code Playgroud)
最大元素是55(位置9和12上的两个元素)
我需要找到最大值位于哪个位置.请帮忙.
一个相当常见的操作是list基于另一个过滤一个list.人们很快发现这个:
[x for x in list_1 if x in list_2]
Run Code Online (Sandbox Code Playgroud)
大输入速度慢 - 它是O(n*m).呸.我们如何加快速度?使用a set进行过滤查找O(1):
s = set(list_2)
[x for x in list_1 if x in s]
Run Code Online (Sandbox Code Playgroud)
这给出了很好的整体O(n)行为.然而,我经常看到即使是经验丰富的编码员也会陷入The Trap ™:
[x for x in list_1 if x in set(list_2)]
Run Code Online (Sandbox Code Playgroud)
确认!这也是O(n*m),因为python set(list_2) 每次构建,而不仅仅是一次.
我认为那是故事的结尾 - python无法优化它只能构建set一次.请注意陷阱.要忍受它.嗯.
#python 3.3.2+
list_2 = list(range(20)) #small for demonstration purposes
s = set(list_2)
list_1 = list(range(100000))
def f():
return [x for x in list_1 if x in s] …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚如何获取一个整数列表并将该列表中的所有项目返回到另一个列表中,作为它们的最大值但带有索引。
因此,我需要能够做到这一点,而无需使用枚举,lambda,numpy或任何此类的东西。它必须是列表的真正基本方法。基本上,诸如append,max等。。如果for语句也很好。
为了弄清楚我要做什么,请说我有一个清单:[4, 34, 0, 0, 6, 34, 1]
我希望它返回[1, 5]