当前位置: 代码迷 >> python >> Python从其他字符串列表中计算列表中的子字符串数,不重复
  详细解决方案

Python从其他字符串列表中计算列表中的子字符串数,不重复

热度:49   发布时间:2023-06-16 13:56:57.0

我有两个清单:

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

一个班轮

>>>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到给你计数。

您可以使用pandas (提供快速矢量化操作)和str.containssum()

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()

你可以通过其他方式做到这一点。 创建仅包含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的长度就是你的答案。

那这个呢

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

这样做:

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

如果你的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