我有一个包含数千个短字符串的列表和一个包含数十万个短字符串的.csv文件。所有列表元素都是唯一的。对于.csv文件中的每个字符串,我需要检查它是否包含多个列表元素。
例如。我有一个字符串:
example_string = "mermaids have braids and tails"
列表:
example_list = ["me", "ve", "az"]
显然,示例字符串包含多个列表项;我和我。我的代码需要指出这一点。但是,如果列表是
example_list = ["ai", "az", "nr"]
只包含一个列表元素。
我认为以下代码将检查我的.csv文件中的每一行是否包含至少一个列表元素。但是,这并不能告诉我它是否包含多个不同的列表元素。
data = file("my_file_of_strings.csv", "r").readlines()
for line in data:
if any(item in my_list for i in line):
#Do something#
答案 0 :(得分:2)
with open("my_file_of_strings.csv", "r") as data:
for line in data:
if any(item in i for i in line.split() for item in my_list):
...
如果您需要计算它们,请使用sum()
with open("my_file_of_strings.csv", "r") as data:
for line in data:
result = sum(item in i for i in line.split() for item in my_list):
答案 1 :(得分:1)
def contains_multiple(string, substrings):
count = 0
for substring in substrings:
if substring in string:
count += 1
if count > 1:
return True
return False
for line in data:
if contains_multiple(line, my_list):
...
不短,但一旦找到第二场比赛就会提前退出。这可能是也可能不是重要的优化。
答案 2 :(得分:0)
类似的东西:
data = file("my_file_of_strings.csv", "r").readlines()
for line in data:
if len(set(item for item in my_list if item in line)) > 1:
#Do something#
答案 3 :(得分:0)
我认为其他解决方案更适合您的目的,但如果您想要跟踪点击次数以及点击次数,可以试试这个:
In [14]: from collections import defaultdict
In [15]: example_list = ["me", "ve", "az"]
In [16]: example_string = "mermaids have braids and tails"
In [17]: d = defaultdict(int)
In [18]: for i in example_list:
....: d[i] += example_string.count(i)
....:
In [19]: d
Out[19]: defaultdict(<type 'int'>, {'me': 1, 'az': 0, 've': 1})
然后获得唯一匹配的总数:
In [20]: matches = sum(1 for v in d.values() if v)
In [21]: matches
Out[21]: 2