python以最快的方式匹配具有巨大数据大小的字符串

时间:2015-12-06 20:25:53

标签: python numpy astropy

我有一个包含元素的大型表数据(或记录数组):

tbdata[i]['a'], tbdata[i]['b'], tbdata[i]['c']

都是整数,i是0到100万之间的随机数(表的大小)。

我还有一个名为Name的列表,其元素都是文件的名称(总共900个名称),例如'/Users/Desktop/Data/spe-3588-55184-0228.jpg'(已修改),都包含三个数字。

现在我想从我的tbdata中选择那些上面提到的元素都与列表Name名称中的三个数字相匹配的数据。这是我最初写的代码:

Data = []
for k in range(0, len(tbdata)):
    for i in range(0, len(NameA5)):
        if Name[i][43:47] == str(tbdata[k]['a']) and\
             Name[i][48:53] == str(tbdata[k]['b']) and\
             Name[i][55:58] == str(tbdata[k]['c']):
            Data.append(tbdata[k])

Python整夜运行但仍未完成,因为数据大小很大或我的算法太慢......我想知道完成这项任务的最快方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以构建一个这样的查找树:

a2b2c = {}
for name in NameA5:
    a = int(name[43:47])
    b = int(name[48:53])
    c = int(name[55:58])

    if a not in a2b2c2name:
        a2b2c2name[a] = {}
    if b not in a2b2c2name[a]:
        a2b2c2name[a][b] = {}
    a2b2c2name[a][b][c] = True

for k in range(len(tbdata)):
    a = tbdata[k]['a']
    b = tbdata[k]['b']
    c = tbdata[k]['c']
    if a in a2b2c2name and b in a2b2c2name[a] and c in a2b2c2name[a][b]:
        Data.append(tbdata[k])