我是一个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
也是如此。
所以我想我的问题是,是否有更好的方法来编写上面的代码?我在这里想迭代器,但在这种情况下并不完全确定如何写一个。
答案 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]