Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在已排序的日期列表中查找新数据插入位置的最快方法_Python_Search_Insert - Fatal编程技术网

Python 在已排序的日期列表中查找新数据插入位置的最快方法

Python 在已排序的日期列表中查找新数据插入位置的最快方法,python,search,insert,Python,Search,Insert,假设我有一个日期列表: mydates = [Timestamp('2017-03-31 00:00:00'), Timestamp('2017-06-30 00:00:00') Timestamp('2017-09-30 00:00:00'), Timestamp('2017-12-31 00:00:00'), Timestamp('2018-03-31 00:00:00')] 我得到了一个新的日期,想知道该插入哪个位置。如果该日期已在列表中,我们假设将再次将其插入现有

假设我有一个日期列表:

mydates = [Timestamp('2017-03-31 00:00:00'),
  Timestamp('2017-06-30 00:00:00')     
  Timestamp('2017-09-30 00:00:00'),
 Timestamp('2017-12-31 00:00:00'),
 Timestamp('2018-03-31 00:00:00')]
我得到了一个新的日期,想知道该插入哪个位置。如果该日期已在列表中,我们假设将再次将其插入现有日期的右侧


也就是说,
'2016-12-10'
将插入位置0,左至
时间戳('2017-03-31 00:00:00')
,等等。

如果您有已排序的列表,您可以插入新日期并对结果进行排序。您还可以使用。

如果您有已排序的列表,则可以插入新日期并对结果进行排序。您也可以使用。

一般来说,找到位置的最佳方法是对数搜索。但细节取决于你拥有什么

另外,请注意,即使您将搜索从线性时间改进为对数时间,如果您使用的是
列表
数组
之类的数据结构,
插入
仍然需要线性时间(因为它必须将列表的其余部分向上移动)。因此,您可能优化了错误的内容

  • 对于一个非常小的集合,比如一个包含5个值的
    列表
    ,您最好只使用线性搜索
  • 如果您在一个阶段中完成了几乎所有的插入,并且在收集之后几乎所有的搜索都已经完成,只需使用
    集合收集所有内容。添加
    列表。追加
    ,然后在该阶段结束时对其进行
    排序。这仍然是有效的(摊销)日志时间,但有更好的乘数
  • 对于
    列表
    或其他普通
    序列
    ,请使用stdlib
  • 对于numpy
    数组
    ,或在其上构建的类似熊猫
    系列的东西:使用numpy的。(如果您正在存储一组Pandas
    Timestamp
    对象,您可能应该使用这些数据结构中的一种,而不是
    列表
    ,如果您还没有这样做的话。)
  • 如果您正在执行大量插入(和删除?)与查找交错,那么您可能希望切换到对数数据结构。这里有很多选择,但类似的东西是一个很好的起点

一般来说,找到位置的最佳方法是对数搜索。但细节取决于你拥有什么

另外,请注意,即使您将搜索从线性时间改进为对数时间,如果您使用的是
列表
数组
之类的数据结构,
插入
仍然需要线性时间(因为它必须将列表的其余部分向上移动)。因此,您可能优化了错误的内容

  • 对于一个非常小的集合,比如一个包含5个值的
    列表
    ,您最好只使用线性搜索
  • 如果您在一个阶段中完成了几乎所有的插入,并且在收集之后几乎所有的搜索都已经完成,只需使用
    集合收集所有内容。添加
    列表。追加
    ,然后在该阶段结束时对其进行
    排序。这仍然是有效的(摊销)日志时间,但有更好的乘数
  • 对于
    列表
    或其他普通
    序列
    ,请使用stdlib
  • 对于numpy
    数组
    ,或在其上构建的类似熊猫
    系列的东西:使用numpy的。(如果您正在存储一组Pandas
    Timestamp
    对象,您可能应该使用这些数据结构中的一种,而不是
    列表
    ,如果您还没有这样做的话。)
  • 如果您正在执行大量插入(和删除?)与查找交错,那么您可能希望切换到对数数据结构。这里有很多选择,但类似的东西是一个很好的起点

看起来您的日期没有排序。那么什么是
时间戳
?假设
时间戳
来自pandas库,您应该利用
np.searchsorted
np.searchsorted(mydates,Timestamp('2016-12-10'))
-返回0。如果您有排序数组,二进制搜索通常是搜索它的最佳方式。它的可能重复项看起来不像您的日期已排序。那么什么是
Timestamp
?假设
Timestamp
来自熊猫库,您应该利用
np.searchsorted
np.searchsorted(mydates,Timestamp('2016-12-10'))
-返回0。如果您有一个排序的数组,二进制搜索通常是搜索它的最佳方式。可能是重复的