基于lis的元组快速排序与提取

2024-04-28 11:14:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个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')]

如果x中的元素存在于y[i][1],我想从y获取id。比如说:

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。你知道吗

所以我想我的问题是,是否有更好的方法来编写上述代码?我在这里考虑迭代器,但不完全确定在这种情况下如何编写迭代器。你知道吗


Tags: 代码inid列表forpdf排序dir
3条回答
x = ["d5b44796d43c4bf5a0f252aeb49738f5", "04d0e11f8ceb4b128fa723181369ba1a", "6244dd8bfee44a61800a25d9f2e6f743", "662ae26640a44a37816daa6e85ef4972", "7d5e1f59f7984495877a059bea643954"]

xset = set(x)

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')]

print [num for num, path in y if path.split('/')[1].split('.')[0] in xset]

如果要保持x中的顺序,需要提取y中的所有ID并将它们放入一个集合中,然后对x进行迭代以检查集合中是否有项:

>>> 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')]
>>> s = set()
>>> for e in y:
...     r = re.match(r'^dir/(.*)\.', e[1])
...     if r:
...             s.add(r.group(1))
>>> [e for e in x if e in s]
id_list = [j[0] for j in sorted(y, key=lambda e: x.index(e[1].split('/')[-1].split('.')[0]))]    

如果x是dict,这可以得到改进,因为查找会更快,所以我们将使用OrderedDict来保持顺序:

import collections
from os.path import basename, splitext

x = collections.OrderedDict((e, i) for i, e in enumerate(x))

id_list = [j[0] for j in sorted(y, key=lambda e: x[splitext(basename(e[1]))[0]])]

相关问题 更多 >