这是两个功能(我认为)应该做同样的事情,但实际上没有。
似乎在列表推导中,所采用的索引是第一个可以对应的索引,因此当您在不同索引处具有相同的值时,存在歧义。
有没有办法修改filter2
中的列表理解,所以得到与filter1
中相同的结果?
L = [98.75011926342906,
97.8178200008178,
98.6138182016438,
98.55520874507613,
98.25262038791283,
98.75011926342906,
99.06770073738875,
98.66970163697574,
98.56611283001895,
98.47751713985852,
98.66970163697574,
97.8178200008178]
def filter1(L, threshold=98.7):
items = []
for i in range(len(L)):
if L[i] < threshold:
items.append(i)
return items
def filter2(L, threshold=98.7):
items = [L.index(x) for x in L if x <= threshold]
return items
print filter1(L)
>>> [1, 2, 3, 4, 7, 8, 9, 10, 11]
print filter2(L)
>>> [1, 2, 3, 4, 7, 8, 9, 7, 1]
答案 0 :(得分:5)
您可以在此处使用enumerate
作为帮助:
bad_items = [i for i, x in enumerate(L) if x <= threshold]
enumerate
将为您提供成对的(index, value)
,您可以在理解中解压(进入i, x
)。然后,只有i
才能x <= threshold
。
答案 1 :(得分:3)
您有索引7而不是10的原因是因为您有重复的元素,索引返回值存在的最小索引。此外,搜索索引也需要线性时间。你的整个循环是二次的。
答案 2 :(得分:0)
你可以使用enumerate,它将循环的位置分配给i,x用当前值赋值。
def filter2(L, threshold=98.7):
items = [i for (i, x) in enumerate(L) if x <= 98.7]
return items