我正在尝试根据第二个列表中的浮点数生成的范围从列表(list1)中提取浮点数(秒)。第一个列表如下所示:
list1 = [12.5, 15.3, 17.8, 20.4, 21.3, 24.5, 26.5, 28.3, 30.4, 33.5, 36.7]
第二个列表(list2)如下:
list2 = [20.4, 26.5, 33.5]
对于list2中的每个项目,我想在3秒内检索列表1中的项目。
谢谢!
答案 0 :(得分:2)
您可以将值存储在字典中以便更快地获取它们,并且可以使用try-except块来测试值是否在数组/列表中。
示例值:
#Inputs
list1 = [12.5, 15.3, 17.8, 20.4, 21.3, 24.5, 26.5, 28.3, 30.4, 33.5, 36.7]
list2 = [20.4, 26.5, 33.5]
#To get value faster 0(1) time complexity use dictionary
list1_dict = (dict( zip( list1, list1)))
#Loop for each value in list2
for v in list2:
try:
value = list1_dict[v]
except:
value = None
if value != None:
print("{} value found in list1".format(value))
else:
print("{} value NOT found in list1".format(value))
输出:
{17.8:17.8,20.4:20.4,21.3:21.3,36.7:36.7,33.5:33.5,24.5:24.5,28.3:28.3,26.5:26.5,12.5:12.5,30.4:30.4,15.3:15.3}
在list1中找到20.4的值
在list1中找到26.5的值
在list1中找到33.5值
答案 1 :(得分:1)
import pandas
list1 = pandas.Series([12.5, 15.3, 17.8, 20.4, 21.3, 24.5, 26.5, 28.3, 30.4, 33.5, 36.7])
list2 = [20.4, 26.5]
print(list1[list1.between(*list2)])
会按照我的想法做...
(我不确定我是否完全理解您的问题...)
答案 2 :(得分:1)
您可以使用np.searchsorted
在list1
中查找所需的索引。顾名思义,这要求对list1
进行排序:
idx = np.searchsorted(list1,np.add.outer(list2,(-3,3)))
[list1[l:r] for l,r in idx.tolist()]
# [[17.8, 20.4, 21.3], [24.5, 26.5, 28.3]]
答案 3 :(得分:1)
您尚未说出最终输出的外观。我假设您想要一个列表列表,其中第n个列表包含list1
中位于第n个项目3秒之内的list2
的所有元素。您可以根据需要进行调整以创建其他结构。
这是一个简单的版本,除非list1
很长,否则可能足够快:
list1 = [12.5, 15.3, 17.8, 20.4, 21.3, 24.5, 26.5, 28.3, 30.4, 33.5, 36.7]
list2 = [20.4, 26.5, 33.5]
list3 = [
[x for x in list1 if abs(x-y) <= 3]
for y in list2
]
print(list3)
# [[17.8, 20.4, 21.3], [24.5, 26.5, 28.3], [33.5]]
由于list1
已排序,因此您可以使用二等分算法快速搜索它。如果list1
很长,这会更快:
import bisect
def get_matches(val, lst):
""" Return list of items in lst that are within 3.0 of val. """
left = bisect.bisect_left(lst, val - 3.0)
right = bisect.bisect_right(lst, val + 3.0)
return lst[left:right]
list3 = [get_matches(x, list1) for x in list2]
print(list3)
# [[17.8, 20.4, 21.3], [24.5, 26.5, 28.3], [33.5]]