根据范围从列表中提取浮点数

时间:2019-11-26 04:21:43

标签: python list numpy

我正在尝试根据第二个列表中的浮点数生成的范围从列表(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中的项目。

谢谢!

4 个答案:

答案 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.searchsortedlist1中查找所需的索引。顾名思义,这要求对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]]