【问题标题】:Faster searching in Python - Postcodes在 Python 中更快地搜索 - 邮政编码
【发布时间】:2017-04-14 00:01:12
【问题描述】:

我一直在研究一种 no-sql 解决方案,以使用国家邮政编码列表命名 N 个邮政编码列表。到目前为止,我有新南威尔士州的参考字典,格式如下:

{'Belowra': 2545, 'Yambulla': 2550, 'Bingie': 2537, ... [n=4700]

我的 函数使用它来查找邮政编码的名称:

def look_up_sub(pc, settings):
    output=[]
    for suburb, postcode in postcode_dict.items():
        if postcode == pc and settings=='random':#select match at random
            print(suburb)                        #remove later
            output.append(suburb)
            break                                #stop searching for matches
        elif postcode == pc and settings=='all': #print all possible names for postcode
            print(suburb)                        #remove later
    return output 

N=[2000,2020,2120,2019]
for i in N:
    look_up_sub(i, 'random')

>>>Millers Point
>>>Mascot
>>>Westleigh
>>>Banksmeadow

虽然对于小列表来说还可以,但当 N 足够大时,这种低效的方法非常慢。我一直在考虑如何使用 numpy 数组来大大加快速度,并正在寻找更快的方法来解决这个问题。

【问题讨论】:

  • 你为什么要遍历你的字典来寻找匹配?这打败了整点,你还不如有一个元组列表。您的数据结构是倒退的,它应该从 postcode:suburb 开始,然后当您将其传递给 pc 时,您会返回一个郊区列表,然后从该列表中随机选择或在列表中打印所有郊区。
  • 同意!字典的美妙之处在于 O(1) 查找,迭代它真的打败了重点
  • 这绝对有帮助,谢谢postcode_dict = dict(zip(postcode,suburb)) print(postcode_dict[2000])

标签: python numpy dictionary postal-code


【解决方案1】:

您的数据结构是向后的,它应该从postcode:suburb 开始,然后当您将其传递给电脑时,您会返回一个郊区列表,然后从该列表中随机选择或将所有郊区打印在列表中。 这是你应该做的,首先,反转你的字典:

import defaultdict
post_to_burb = defaultdict(list)
for suburb, postcode in postcode_dict.items():
    post_to_burb[postcode].append(suburb)

现在,您的函数应该执行以下操作:

import random
def look_up_sub(pc, settings):
    output = []
    if settings == "random":
        output.append(random.choice(post_to_burb[pc]))
    elif settings == 'all':
        output.extend(post_to_burb[pc])
    return output

在这里使用 numpy 会很笨拙,尤其是当您使用字符串时。您可能会在运行时获得一些边际改进,但您的整体算法仍将是线性时间。现在是固定时间,一旦您设置了 post_to_burb 字典。

【讨论】:

  • 我做了类似的事情并在大约一秒钟内得到了 47534 个邮政编码列表的结果,再次感谢。
【解决方案2】:

建立一个从邮政编码到郊区的字典:

from collections import defaultdict
code_to_urbs = defaultdict(list)
for suburb, postcode in postcode_dict.items():
    code_to_urbs[postcode].append(suburb)

完成后,您可以写code_to_urbs[postal_code]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多