基于列表快速排序(并从中提取)元组

时间:2015-05-25 12:04:18

标签: python sorting

我是一个python新手,我一直在尝试根据列表中的值从元组中排​​序(并提取)值,但到目前为止,我的代码似乎很慢。

所以,我有一个这样的清单:

x = ["d5b44796d43c4bf5a0f252aeb49738f5", "04d0e11f8ceb4b128fa723181369ba1a", "6244dd8bfee44a61800a25d9f2e6f743", "662ae26640a44a37816daa6e85ef4972", "7d5e1f59f7984495877a059bea643954"]

,我有一个像这样的元组:

y = [(31, u'dir/04d0e11f8ceb4b128fa723181369ba1a.mov'), (32, u'dir/d5b44796d43c4bf5a0f252aeb49738f5.pdf'), (66, u'dir/6244dd8bfee44a61800a25d9f2e6f743.jpg'), (34, u'dir/662ae26640a44a37816daa6e85ef4972.doc'), (33, u'dir/7d5e1f59f7984495877a059bea643954.ppt')]

如果id中的元素出现在y中,我希望从x获取y[i][1]。所以,像这样:

id_list=[]
for i in x:
    for j in y:
        if i in j[1]:
            try:
                id_list.append(j[0])
            except:
                pass
            break
        else:
            pass

我明白了:

id_list = [32, 31, 66, 34, 33]

此外,结果集必须维持x的顺序。 上面的循环就是这样做的。

问题是上面的代码非常慢(感到惭愧!) - 我的x是1000,而y也是如此。

所以我想我的问题是,是否有更好的方法来编写上面的代码?我在这里想迭代器,但在这种情况下并不完全确定如何写一个。

2 个答案:

答案 0 :(得分:1)

span

如果x为id_list = [j[0] for j in sorted(y, key=lambda e: x.index(e[1].split('/')[-1].split('.')[0]))] ,可以改进这一点,因为查找会更快,因此我们会使用dict维护订单:

OrderedDict

答案 1 :(得分:0)

在此answer中:使用[:-4]可能不是一个好主意,如果我们有dir/04d0e11f8ceb4b128fa723181369ba1a.rmvb怎么办?我建议使用os.path.splitext(os.path.basename(thefilepath))[0]来获取文件名。

所以我的想法是:我们首先将元素映射到id,yy应该是:

{u'7d5e1f59f7984495877a059bea643954': 33,u'6244dd8bfee44a61800a25d9f2e6f743': 66, u'662ae26640a44a37816daa6e85ef4972': 34, u'04d0e11f8ceb4b128fa723181369ba1a': 31, u'd5b44796d43c4bf5a0f252aeb49738f5': 32}

我们使用yy[element]获取ID,顺序应该像以前一样。

解决方案:

from os import path

yy = {path.splitext(path.basename(j))[0]:i for (i, j) in y}
xx = [yy[i] for i in x]
print(xx)

# output
[32, 31, 66, 34, 33]