我可以帮忙翻译关于IT技术的中文内容。以下是需要翻译的内容:
寻找在Python(3.6+)列表中高效搜索部分字符串的方法。
我有两个列表。 listA是一个包含路径名和唯一文件名的字符串列表:
['/pathname/uniquestring.ext', '/pathname/uniquestring.ext', '/pathname/uniquestring.ext' ...]
(使用glob()创建,文件名已给出且存在)
listB是一个字典列表。每个字典都有相同的键集,但具有唯一的值。
[{key1:value1, key2:value2}, {key1:value3, key2:value4}, ...]
在列表B中,每个字典中的一个键值对将具有一个值,该值“包含于”列表A中的一个唯一项中。
但是,该值在列表A的每个项中出现的位置是不确定的。
我需要的是:对于列表B中的每个项,找到包含与字典中k:v对匹配的子字符串的列表A中的项,并创建一个新的字典(或元组列表)作为“查找表”(目标是纠正一组图像文件中损坏的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, ...}
以下是我从字典推导式中得到的准确结果:
{j:i['create_date'] for j in listA for i in listB if i['id'] in j}
但是,即使对于我的非常小的文件(~5500个项目),这在我的(尽管有些陈旧)笔记本电脑上需要12秒。
这可能是因为我必须使用我的方法迭代整个listB约5500次。
在Python中是否有更有效的方法?
(注:我不是寻求如何用Python纠正exif数据的建议;这是关于列表中字符串查找的广义问题。)
更正和澄清:
- 我忽略了在我的示例中将值“123456”括在引号中,当然意味着它是一个整数;在实际数据中,它不是,也不是我处理的任何等效值。
- 作为listA项中出现的子字符串,“id”几乎总是由下划线分隔的,但出现在整个字符串中的位置并不总是相同的;因此,对每个项目执行split('_ ')并不总是将“id”字符串放置在位置[-1]或[-2]或[-3],尽管[-1]会处理大约80%的情况。
- 所有“id”都是唯一的,在列表中不会重复出现; listA中的每个文件名都是唯一的; 每个“id”从不出现在多个字典中。
顺便说一句,感谢大家的兴趣。
'id'
的值为123456
是一个整数,所以在这里i['id'] in j
的测试会失败。文件名中的 id 部分是否总是由下划线或_
分隔的? - Martijn PieterslistB
中是否可以有多个条目与listA
中的文件名匹配?如果不行,您可以在找到给定文件名的匹配项时从(副本)listB
中弹出找到的元素。 - AKX