Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.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_Sorting_Dictionary - Fatal编程技术网

Python 大型可排序数据结构?字典还是别的什么?

Python 大型可排序数据结构?字典还是别的什么?,python,sorting,dictionary,Python,Sorting,Dictionary,我有一个大型python字典(65535键:值对),其中键是range(065536),值是整数 我找到的排序此数据结构的解决方案发布在此处: 该解决方案可行,但不一定很快 使问题进一步复杂化的是,我有可能拥有许多(数千)这样的词典,在排序之前必须将它们组合在一起。我目前正在通过迭代一个字典中的对,在另一个字典中进行键查找,并根据需要添加/更新条目来组合这些字典 这使我的问题有两个方面: 1) 字典是解决这个问题的正确数据结构吗?自定义树或其他东西更有意义吗 2) 如果字典是明智、合理的选择,

我有一个大型python字典(65535键:值对),其中键是range(065536),值是整数

我找到的排序此数据结构的解决方案发布在此处:

该解决方案可行,但不一定很快

使问题进一步复杂化的是,我有可能拥有许多(数千)这样的词典,在排序之前必须将它们组合在一起。我目前正在通过迭代一个字典中的对,在另一个字典中进行键查找,并根据需要添加/更新条目来组合这些字典

这使我的问题有两个方面:

1) 字典是解决这个问题的正确数据结构吗?自定义树或其他东西更有意义吗

2) 如果字典是明智、合理的选择,那么将字典的倍数组合起来然后进行排序的理想方法是什么

对我来说,一个解决方案可能是重新设计我的程序流程,以便将维护的词典数量减少到一个,尽管这是最后的手段


谢谢

这里没有足够的信息说明您应该使用哪种数据结构,因为我们不知道您还用它做了什么

如果您需要能够在以后一次将一条记录快速插入到数据结构中,那么您确实需要一个树状的数据结构,不幸的是,它在Python中没有标准实现(甚至对于某些操作没有标准接口)

如果您只需要能够按照您所说的对现有数据进行排序,那么您可以使用列表。排序很快,特别是当部分数据已经排序时,您可以使用二进制搜索进行快速查找。但是,插入元素将是O(n),而不是树中的O(logn)

下面是一个简单的示例,将dict转换为列表或元组,对组合结果进行排序,并使用对分模块搜索项目

请注意,您可以有重复的键,显示在多个dict中。这很容易处理:它们将自然地排序在一起,并且平分将为您提供一个包含所有这些键的[start,end]范围

如果以后要添加数据块,请将其追加到末尾并对列表重新排序;Python的排序在这方面做得很好,可能比O(n log n)好得多

正如您所说,这段代码假设您的密钥是整数

dataA = { 1: 'data1', 3: 'data3', 5: 'data5', 2: 'data2' }
dataB = { 2: 'more data2', 4: 'data4', 6: 'data6' }

combined_list = dataA.items() + dataB.items()
combined_list.sort()
print combined_list

import bisect
def get_range(data, value):
    lower_bound = bisect.bisect_left(data, (value, ))
    upper_bound = bisect.bisect_left(data, (value+1, ))
    return lower_bound, upper_bound

lower_bound, upper_bound = get_range(combined_list, 2)
print lower_bound, upper_bound
print combined_list[lower_bound:upper_bound]

有了这么多的数据,我会咬紧牙关,使用内置的sqlite模块。是的,您放弃了python的一些灵活性,不得不使用SQL,但现在它的排序是65k值;接下来是查找满足某些条件的值。因此,与其重新创建关系数据库,不如现在就使用SQLted有65535个条目,其中键的范围为(0:65536),听起来很像数组。如果需要排序数组,为什么要使用字典

通常,在Python中,您将使用这种类型的数据列表。在这种情况下,由于值是整数,您可能还需要考虑使用数组模块。您还应该查看HEAPQ模块,因为如果您的数据可以以这种方式表示,那么就有一个可以使用的Buffin合并函数。
在任何情况下,如果需要合并数据结构并生成排序后的数据结构,最好使用合并算法,一种可能是合并排序算法。

如果键是(连续的)整数,为什么不使用列表呢?另请参见仅使用
A.update(B)
即可合并字典的步骤。因此,我意识到更正确的提问方式是“我需要一个键和值都是整数的值排序字典。”它需要是键:基于值的,因为我想根据值排序,但返回键进行分析。如果你实际上不需要它,这是严重的过度设计。但是当你看到他想用数千个字典进行查找和更新时,我认为关系方法将是更受支持的选择。下一个必须使用其代码的人至少有机会了解正在发生的事情。我同意这种方法有太多的开销和过度设计。不幸的是,我也希望使用最少的额外模块。我想你是对的。我最近很“pythonic”(或者至少这是我的借口)我完全忽略了一个事实,即列表很可能更合适。在这种情况下,我总是使用1-65525作为“键”(虽然集合不需要完整,但这并不重要)。我将做一个小测试,然后如果对我有效,将此作为答案。Michael,请参阅我上面的评论。我意识到我需要将键与值耦合,以便根据值顺序返回它们。好的,我看到了问题。但是如果您将元组放在列表中,即,如果您不将[36873398,227464512007]放在列表中,则您会这样做[(03687),(13398),(2,22),(37464),(4541),(52007)]然后您可以根据值对列表进行排序,并且不会丢失原始列表索引/键。我将使用元组列表。感谢您的深入了解。如果我有问题,我将向您报告!(奇怪的是,这个答案似乎被一条评论所接受,这条评论与我前一天详细解释的完全相同。)键和值都是整数,我需要对值进行排序(这在您的解决方案中仍然有效)。我将对你的答案和Michael Dillion的答案做一点比较。我看到的问题是,你的答案没有正确地合并数据。我希望在键相同的情况下将值添加到一起。@Locker537:不,这会将相同的键并排放置,这使得合并它们变得简单。你是对的。当我看到添加。项目。谢谢!