Python:在迭代列表时从列表中删除元素,以及在范围内查找值的最有效方法

谢恩

我有一些(非常大的)元组列表,它们来自包含 id、start_time 和 end_time 的数据库

我还有一个定期和有序的时间列表(这些都是日期时间对象)。

我基本上需要遍历这些时间并找到时间落在其范围内的所有元组。

我想知道最有效的方法是什么。想到的第一个想法是这样的(伪代码):

for time in times:
    for tuple in tuples:
        if tuple.start_time <= time <= tuple.end_time:
            # add tuple to some_other_list
        if tuple.end_time < time
            # remove tuple from tuples

我这样做的原因是迭代一个越来越小的列表,希望在那里减少一些时间,但是我也对完全不同的方法持开放态度。我想另一个想法是在每次迭代中只用给定的时间查询数据库,但我认为那里的延迟将远远超过将完整数据集保存在内存中并以这种方式使用它。

例如,我会有一个元组列表,其中每个元组看起来像:

[('783', datetime.datetime(2017, 12, 31, 20, 49, 28), datetime.datetime(2017, 12, 31, 23, 49, 28)), ('5274', datetime.datetime(2017, 12, 31, 20, 49, 45), datetime.datetime(2018, 1, 1, 0, 0)), ('757', datetime.datetime(2017, 12, 31, 20, 50, 25), datetime.datetime(2018, 1, 1, 1, 50, 25)), ('5600', datetime.datetime(2017, 12, 31, 20, 50, 59), datetime.datetime(2017, 12, 31, 23, 39)), ('5176', datetime.datetime(2017, 12, 31, 20, 51, 23), datetime.datetime(2018, 1, 1, 1, 51, 23)), ('5323', datetime.datetime(2017, 12, 31, 20, 52, 39), datetime.datetime(2018, 1, 1, 0, 0)), ('464', datetime.datetime(2017, 12, 31, 20, 52, 41), datetime.datetime(2018, 1, 1, 0, 52, 41))]

时间列表将基本上使用这个答案存储在生成器中,因此循环遍历它们会产生如下结果:

2017-12-15 00:00:00
2017-12-22 00:00:00
2017-12-29 00:00:00
2018-01-05 00:00:00
2018-01-12 00:00:00
2018-01-19 00:00:00

而我相当不可知的实际输出,它只是一些字典

{'2017-12-15 00:00:00': [list of matching ids], '2017-12-22 00:00:00': [list of matching ids], ...}

任何想法或建议将不胜感激!

戴维斯鲱鱼

首先,关于删除不相关间隔的注意事项:如果您从(长)列表中执行此操作,则性能将很糟糕,因为需要将后面的元素移入空白空间。可以通过用一个整数替换已删除的元素来解决这个问题,该整数表示要跳过多远才能找到下一个真实数据。

这是经典的区间查询问题,通常的答案是区间树。但是,如果您可以一次存储所有结果(以及所有已排序的查询时间),则可以使用一个简单的替代方法:不是迭代时间然后搜索区间,而是在所有区间迭代一次并执行二分搜索找出每个区间包含的最早和最晚查询时间。然后将时间间隔的 ID 附加到为每个这样的时间维护的列表中:

def ids(iv,tm):
  ret=[[] for _ in tm]
  for nm,l,h in iv:
    for i in range(bisect.bisect_left(tm,l),bisect.bisect_right(tm,h)):
      ret[i].append(nm)
  return ret

您当然可以使用dict(zip(tm,ids(iv,tm))).

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有效的方式来从一个更大的范围内删除范围的列表中的元素

来自分类Dev

查找列表中两个元素的所有组合的最有效方法

来自分类Dev

查找元素文本列表的最有效方法Selenium Python

来自分类Dev

从列表中删除重复项的最有效方法

来自分类Dev

删除列表中条目的最有效方法

来自分类Dev

查找Mac地址是否在范围内的最有效方法是什么?

来自分类常见问题

删除列表中前N个元素的最有效方法是?

来自分类Dev

循环查找不在python列表中的项目的最有效方法

来自分类Dev

从 HashMap 中删除值在指定范围内的条目的有效方法

来自分类Dev

“截断”值以在范围内重复的最有效方法?

来自分类Dev

在 Python 中创建字典列表的最有效方法

来自分类Dev

删除范围内的列表中的元素

来自分类Dev

在Python中迭代列表并找到合适的字符串模式的最快(最有效)方法是什么?

来自分类Dev

在两个不同列表中查找相同索引号以比较值的最有效方法

来自分类Dev

检查字节数组值的最有效方法是否在范围内/阈值以下?

来自分类Dev

检查数字范围内数字范围(无重复)的最有效方法

来自分类Dev

从键列表中检索字典的所有元素的最有效方法?

来自分类Dev

查找列表中是否重复的最有效方法是什么?

来自分类Dev

在Haskell中检查3个列表以查找公共整数的最有效方法

来自分类Dev

查找列表中是否重复的最有效方法是什么?

来自分类Dev

在Scala中搜索嵌套列表以查找元组的最有效方法

来自分类Dev

从列表中删除具有空属性的对象的最有效方法

来自分类Dev

python中最有效的计算方式在对列表中查找对

来自分类常见问题

搜索数据框中列表的每个元素的最有效方法

来自分类Dev

在numpy中给定索引列表的最有效添加元素的方法

来自分类Dev

搜索数据框中列表的每个元素的最有效方法

来自分类Dev

根据列表从pandas df中删除行的最有效方法?

来自分类Dev

WPF:从绑定列表中删除最后一项的最有效方法?

来自分类Dev

根据列表从pandas df中删除行的最有效方法?

Related 相关文章

  1. 1

    有效的方式来从一个更大的范围内删除范围的列表中的元素

  2. 2

    查找列表中两个元素的所有组合的最有效方法

  3. 3

    查找元素文本列表的最有效方法Selenium Python

  4. 4

    从列表中删除重复项的最有效方法

  5. 5

    删除列表中条目的最有效方法

  6. 6

    查找Mac地址是否在范围内的最有效方法是什么?

  7. 7

    删除列表中前N个元素的最有效方法是?

  8. 8

    循环查找不在python列表中的项目的最有效方法

  9. 9

    从 HashMap 中删除值在指定范围内的条目的有效方法

  10. 10

    “截断”值以在范围内重复的最有效方法?

  11. 11

    在 Python 中创建字典列表的最有效方法

  12. 12

    删除范围内的列表中的元素

  13. 13

    在Python中迭代列表并找到合适的字符串模式的最快(最有效)方法是什么?

  14. 14

    在两个不同列表中查找相同索引号以比较值的最有效方法

  15. 15

    检查字节数组值的最有效方法是否在范围内/阈值以下?

  16. 16

    检查数字范围内数字范围(无重复)的最有效方法

  17. 17

    从键列表中检索字典的所有元素的最有效方法?

  18. 18

    查找列表中是否重复的最有效方法是什么?

  19. 19

    在Haskell中检查3个列表以查找公共整数的最有效方法

  20. 20

    查找列表中是否重复的最有效方法是什么?

  21. 21

    在Scala中搜索嵌套列表以查找元组的最有效方法

  22. 22

    从列表中删除具有空属性的对象的最有效方法

  23. 23

    python中最有效的计算方式在对列表中查找对

  24. 24

    搜索数据框中列表的每个元素的最有效方法

  25. 25

    在numpy中给定索引列表的最有效添加元素的方法

  26. 26

    搜索数据框中列表的每个元素的最有效方法

  27. 27

    根据列表从pandas df中删除行的最有效方法?

  28. 28

    WPF:从绑定列表中删除最后一项的最有效方法?

  29. 29

    根据列表从pandas df中删除行的最有效方法?

热门标签

归档