我目前正在努力寻找一种有效的方法来将附加到列表的字符串元素的一部分与另一个字符串元素进行比较.当前的代码计算非常长(1小时,第一个列表中有4,8百万个元素,第二个列表中有5000个元素).
我需要做的是:如果第一个字符串元素的8个第一个字符等于完整的第二个元素,则使用完整的第一个元素更新第三个列表.一旦找到,我们测试第一个列表的另一个元素.
这是代码:
for first_element in first_List :
for second_element in second_List:
if first_element[:8] == second_element :
third_List.append(first_element)
break
我知道这些循环不是处理非常大的列表的最佳方式. if测试的数量真的很大.
我想知道是否有一种有效的方法来做到这一点.
我认为与集合的交集将不起作用,因为我将元素的一部分与完整的元素进行比较,我需要复制第三个列表中的完整第一个元素.
你有什么建议或意见吗?
解决方法:
这有效:
second_set = set(second_list)
third_list = [value for value in first_list if value[:8] in second_set]
例:
>>> first_list = ['abcdfghij', 'xyzxyzxyz', 'fjgjgggjhhh']
>>> second_list = ['abcdfghi', 'xyzxyzxy', 'xxx']
>>> second_set = set(second_list)
>>> third_list = [value for value in first_list if value[:8] in second_set]
>>> third_list
['abcdfghij', 'xyzxyzxyz']
这应该更有效率.
列表second_list到集合的转换是O(n).
first_list上有一个循环是O(n).集合中的查找,即在second_set中的查找是O(1).
标签:python,string,list,intersection
来源: https://codeday.me/bug/20190824/1706707.html