在Python列表中高效搜索部分字符串
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python列表中高效搜索部分字符串,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2138字,纯文字阅读大概需要4分钟。
内容图文
![在Python列表中高效搜索部分字符串](/upload/InfoBanner/zyjiaocheng/782/d0e59671e4da43fdb29b229fffd2dafd.jpg)
寻找一种在Python(3.6)列表中搜索部分字符串的有效方法.
我有两个清单.
listA是一个唯一文件名的路径名字符串列表:
['/pathname/uniquestring.ext', '/pathname/uniquestring.ext', '/pathname/uniquestring.ext' ...]
(使用glob()创建,文件名全部给定并且已经存在)
listB是一个词典列表.每个字典都具有相同的键集,但具有唯一值.
[{key1:value1, key2:value2}, {key1:value3, key2:value4}, ...]
(也已经给出)
一个键:listB中每个字典中的值对将包含一个值,该值包含在listA中的一个唯一项中.
但是,listA的每个项目中显示的值的位置是不确定的.
我想要的是:对于listB中的每个项目,找到listA中的项目,该项目包含与dict中的k:v对匹配的子字符串,
并创建一个新的dict(或元组列表)作为“查找表”(目标是纠正一组图像文件中损坏的exif创建日期).
例:
listA = ['/pathname/abdce_654321.ext', '/pathname/a3b4c5_123456.ext', '/pathname/cbeebie_645321_abcde.ext', ...]
listB = [{"id": "123456", "create_date": "23/05/2014"}, ...]
new_dict = {"/pathname/a3b4c5_123456.ext": "23/05/2014, ...}
我完全得到了我想要的dict comp如下:
{j:i['create_date'] for j in listA for i in listB if i['id'] in j}
但是,即使对于我的非常小的文件(~5500项),这在我的(不可否认的是相当旧的)笔记本电脑上需要12秒.
大概这是因为我必须使用我的方法迭代整个listB~5500次.
有没有更有效的方法在Python中执行此操作?
(我不是在寻求有关如何使用python更正exif数据的建议;这是关于列表中字符串查找的一般化q)
修正&澄清
>我忽略了在我的例子中围绕值’123456’放置引号,这意味着它当然是一个整数;在现实世界的数据中,它不是,也不是我处理的实际数据中的任何等价值.
> listA项中出现的’id’子字符串几乎总是由下划线分隔,但并不总是出现在整个字符串中的相同位置;因此,例如对每个项目执行拆分(‘_’)并不总是将’id’字符串放在位置[-1]或[-2]或[-3??],尽管[-1]会照顾~80%的病例.
>所有’id’都是唯一的,它们在任一列表中都不会出现多次;每个文件名在listA中是唯一的;每个’id’永远不会出现在多个字典中.
感谢大家的兴趣到目前为止.
解决方法:
我可以看到两条评论的内容.最大的问题是:我们是否需要使用,因为只有当我们不知道id在路径字符串中出现的位置时才需要使用?如果它总是在特定的地方,我们可以提取它并使用恒定时间查找:
def extract_id(path):
# todo
ids = {item['id']: item['create_date'] for item in listB}
new_dict = {path: ids[extract_id(path)] for path in listA}
这只是O(N)而不是你当前的O(N ** 2).
内容总结
以上是互联网集市为您收集整理的在Python列表中高效搜索部分字符串全部内容,希望文章能够帮你解决在Python列表中高效搜索部分字符串所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。