我有一个大的python字典(65535键:值对),其中键是范围(0,65536),值是整数。
我发现排序此数据结构的解决方案在此处发布: Sort a Python dictionary by value
该解决方案有效,但不一定非常快。
为了使问题进一步复杂化,我有可能拥有许多(数千)这些词典,我必须在排序之前将它们结合起来。我目前正在通过迭代一个字典中的对,在另一个字典中进行键查找,以及根据需要添加/更新条目来组合这些字典。
这使我的问题有两个:
1)字典是否是这个问题的正确数据结构?自定义树或其他东西会更有意义吗?
2)如果词典是明智的,合理的选择,那么结合词典的多个然后对它进行排序的理想方法是什么?
我可以通过一种解决方案重新设计我的程序流程,以便将维护的字典数量减少到一个,尽管这是最后的手段。
由于
答案 0 :(得分:2)
一个填充了65535个条目的字典,其范围内的键(0:65536)听起来像一个数组。如果您需要排序数组,为什么使用字典?
通常,在Python中,您将使用此类数据的列表。在您的情况下,由于值是整数,您可能还需要考虑使用数组模块。您还应该查看heapq模块,因为如果您的数据可以用这种方式表示,那么可以使用内置的合并函数。
在任何情况下,如果您需要合并数据结构并生成排序数据结构,最好使用合并算法,这是一种合并算法。
答案 1 :(得分:0)
这里没有足够的信息说明你应该使用哪种数据结构,因为我们不知道你还在用它做什么。
如果您需要能够一次一个地将记录快速插入到数据结构中,那么您确实需要一个树状数据结构,遗憾的是它没有标准实现(甚至是标准接口,对于某些操作)在Python中。
如果您只需要能够执行您所说的内容 - 对现有数据进行排序 - 那么您可以使用列表。排序很快,特别是如果部分数据已经排序,您可以使用二进制搜索进行快速查找。但是,插入元素将是O(n)而不是你用树得到的O(log n)。
这是一个简单的例子,将dicts转换为列表或元组,对组合结果进行排序,并使用bisect模块搜索项目。
请注意,您可以拥有重复的密钥,显示在多个dict中。这很容易处理:它们会自然地一起排序,而二分法会给你一个包含所有这些键的[开始,结束]范围。
如果您想稍后添加数据块,请将其追加到最后并重新排序列表; 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]
答案 2 :(得分:0)
有了这么多的数据,我会咬紧牙关并使用内置的sqlite模块。是的,你放弃了一些python的灵活性,必须使用SQL,但现在它的排序65k值;接下来它将找到符合特定标准的值。因此,不要重新发明关系数据库,而是立即进入SQL路由。