问题描述
我有两个清单:
main_list = ['Smith', 'Smith', 'Roger', 'Roger-Smith', '42']
master_list = ['Smith', 'Roger']
我想计算在main_list字符串中从master_list中找到字符串的次数,而不计算相同项目的两倍。
示例:对于上面的两个列表,我的函数的结果应该是4.'mith'可以在main_list中检索3次。 “罗杰可以被发现2次,但是'史密斯'已经在'罗杰 - 史密斯'中找到了,这个已经不再算了,所以'罗杰'只计算为1,总计4。
我写的知道功能如下,但我认为有更快的方法:
def string_detection(master_list, main_list):
count = 0
for substring in master_list:
temp = list(main_list)
for string in temp:
if substring in string:
main_list.remove(string)
count+=1
return count
1楼
一个班轮
>>>sum(any(m in L for m in master_list) for L in main_list)
4
迭代main_list
并检查master_list
中的any
值是否在该字符串中。
这将为您提供一个bool值列表。
它会在找到一个之后停止,因此每个字符串的计数只添加一个。
便利sum
计算所有的True
s到给你计数。
2楼
您可以使用pandas
(提供快速矢量化操作)和str.contains
和sum()
import pandas as pd
main_list = pd.Series(['Smith', 'Smith', 'Roger', 'Roger-Smith', '42'])
master_list = ['Smith', 'Roger']
count = main_list.str.contains('|'.join(master_list)).sum()
3楼
你可以通过其他方式做到这一点。
创建仅包含main_list
中具有master_list
子字符串的元素的列表
temp_list = [ string for string in main_list if any(substring in string for substring in master_list)]
现在temp_list
看起来像这样:
['Smith', 'Smith', 'Roger', 'Roger-Smith']
所以temp_list
的长度就是你的答案。
4楼
那这个呢
main_list = ['Smith', 'Smith', 'Roger', 'Roger-Smith', '42']
master_list = ['Smith', 'Roger']
print len([word for word in main_list if any(mw in word for mw in master_list)])
5楼
这样做:
main_list = ['Smith', 'Smith', 'Roger', 'Roger-Smith', '42']
master_list = ['Smith', 'Roger']
i = 0
for elem in main_list:
if elem in master_list:
i += 1
continue
for master_elem in master_list:
if master_elem in elem:
i += 1
break
print(i) # i = 4
上面的代码将'Roger-Smith'
为1,如果您希望将其计为多个,请删除break
。
6楼
如果你的master_list不是很大,那么一种方法就是使用正则表达式:
import re
def string_detection(master_list, main_list):
count = 0
master = re.compile("|".join(master_list))
for entry in main_list:
if master.search(entry):
count += 1
return count