1

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

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

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

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

现在我想从我tbdata的上面提到的元素中选择那些与 list 名称中的三个数字匹配的数据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 跑了一夜,仍然没有完成,因为要么数据量很大,要么我的算法太慢......我想知道完成这样一项任务的最快方法是什么?谢谢!

4

1 回答 1

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])
于 2016-01-07T02:00:39.457 回答