搜索Python字典键

搜索Python字典键,python,mysql,Python,Mysql,早在2000年,我就开始在Matlab中编写real代码。创建数组时,可以简单快速地搜索该数组的键。就是这样, found_keys = find(my_array(:, 1) > start_time & my_array(:, 1) < end_time) 其中,我的_数组是一个数组矩阵,在本例中,第一列是一个时间戳。返回的是大于开始时间小于结束时间的时间戳列表。然后,我可以循环找到的_键,只处理我的_数组中相关的数据 我现在正在用Python处理有时间戳的数据,我试图

早在2000年,我就开始在Matlab中编写real代码。创建数组时,可以简单快速地搜索该数组的键。就是这样,

found_keys = find(my_array(:, 1) > start_time & my_array(:, 1) < end_time)
其中,我的_数组是一个数组矩阵,在本例中,第一列是一个时间戳。返回的是大于开始时间小于结束时间的时间戳列表。然后,我可以循环找到的_键,只处理我的_数组中相关的数据

我现在正在用Python处理有时间戳的数据,我试图匹配来自两个不同来源的数据,它们在不同的时区报告时间,但不知道这些时区是什么。来自这两个来源的数据由40k和10K地块的单个事件组成。10K代表两个来源报告的单个事件。这两个源共享3个值相同的字段

因此,理想情况下,我将确定10k源中单个事件的时间戳。然后,我将创建一个时间窗口-+/-12小时,用于定义搜索的开始时间和结束时间。然后我只搜索40k源中时间戳介于开始时间和结束时间之间的单个事件

在Matlab中,这将非常容易,但在Python中,我必须使用OrderedDict将时间戳键从低到高排序。我仍然不知道有什么等效于Matlab的find函数。因此,我被困在每一个10k事件的40k源循环中。显然,一旦找到匹配项,我就可以跳出循环,甚至从dict中弹出值,但这只会大大加快搜索速度。被命令后,我可以在时间戳大于结束时间后退出循环。但同样,这些简单的优化还有很多需要改进的地方

虽然我目前的40k和10k数据集并没有那么大,但我不能只进行大搜索,然后等待结果,我更喜欢一种更快的方法

有什么想法吗

--编辑以显示结果:2015年2月25日--

我偏爱字典理解,因为最终的结果是我需要下游代码的值的字典。时间过得很快,没什么大不了的。然而,到目前为止,numpy解决方案是最快的。以下是数字:

Numpy:0.47毫秒 链式比较列表:11.30毫秒 字典理解:11.82毫秒 所有3个解决方案都提供了相同的答案。在我的测试中,它将43977个单项减少到49个。如果我只运行几次,任何和所有的解决方案都将是完美的,但我可以运行此代码数千次,因此numpy和其他所有代码之间的差异变得很重要。

如果您有一个列表,一个可以处理多种类型的数组,您可以使用列表理解来获取它们!您可以执行以下操作:

new_list = [something(i) for i in list if condition]
这是基本语法。结合比较链接x>y>=z等


将是您的列表,其中my_数组是时间戳列表。

如果您可以使用numpy数组而不是OrderedDict,那么语法与Matlab非常接近

例如,示例行变为:

found_keys = numpy.where((my_array[:, 0] > start_time)*(my_array[:, 0] < end_time))[0]

请注意,在Python中,Matlab的&已更改为*,但numpy也包含了与之相同的内容。

使用Dict理解,这类似于列表理解,但适用于Dict

data = {0: 'w', 1: 's', 2: 'e', 3: 'r', 4: 'v', 5: 'a', 6: 's', 7: 'r', 8: 'e', 9: 'w', 10: 'v', 11: 'a', 12: 's'}
start_timestamp = 3
end_timestamp = 6
filtered_data = {k:v for k, v in data.iteritems() if k > start_timestamp and k < end_timestamp}
结果:
{4:v',5:a'}

您的数据是一个dict,其中键是时间戳字符串吗?或者它的结构不是这样的?对于这两个源,我已经重新格式化了数据,使事件ID成为dict键。在大多数情况下,该键匹配两个源,并且链接2很简单。偶尔也不会。所以我创建了一个索引,其中时间戳浮动是键,40k源的事件ID是值。特别是为了做这个搜索。我有一个dict,所以我假设你会建议将dict键和时间戳转换成一个列表,然后用链式比较运行你的第二行。当我写完这个问题时,我想到了这个想法,但我还没有太多地使用numpy。因此,虽然我认为有一种方法我不确定它会是什么。这将是理想的,因为它将键和值返回到一个新的dict中。我现在正在加载所有数据-需要几分钟。完成后,我将尝试所有3种解决方案。让你知道哪个最快。
data = {0: 'w', 1: 's', 2: 'e', 3: 'r', 4: 'v', 5: 'a', 6: 's', 7: 'r', 8: 'e', 9: 'w', 10: 'v', 11: 'a', 12: 's'}
start_timestamp = 3
end_timestamp = 6
filtered_data = {k:v for k, v in data.iteritems() if k > start_timestamp and k < end_timestamp}