Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算列表中出现的项目-python方式_Python_List - Fatal编程技术网

计算列表中出现的项目-python方式

计算列表中出现的项目-python方式,python,list,Python,List,我的守则如下: result = 0 for line_A in text_A: for line_B in text_B: if line_A in line_B: result += 1 break return result / len(text_A) 这很简单:如果text\u A中的line\u A存在于text\u B中,则对其进行计数并检查另一行。我想知道我是否缺少一些实用工具,或者这种方法是100%正确的吗

我的守则如下:

result = 0
for line_A in text_A:
    for line_B in text_B:
        if line_A in line_B:
            result += 1
            break
return result / len(text_A)

这很简单:如果
text\u A
中的
line\u A
存在于
text\u B
中,则对其进行计数并检查另一行。我想知道我是否缺少一些实用工具,或者这种方法是100%正确的吗?tia

您可以将两个文本转换为集合,然后选择交叉点,如下所示

len(set(text_A) & set(text_B)) / len(text_A)
sum(any(line_A in line_B for line_B in text_B) for line_A in text_A)/len(text_A)
但这里的问题是,如果有重复的文本,那么它只会被计算一次。所以,您可能想使用

sum(line_A in text_B for line_A in text_A) / len(text_A)
但是如果
行A
可以位于
行B
中的任何位置,那么您所拥有的是正确的,并且可以这样简洁地编写

len(set(text_A) & set(text_B)) / len(text_A)
sum(any(line_A in line_B for line_B in text_B) for line_A in text_A)/len(text_A)

您可以将这两个文本转换为集合,然后进行交叉,如下所示

len(set(text_A) & set(text_B)) / len(text_A)
sum(any(line_A in line_B for line_B in text_B) for line_A in text_A)/len(text_A)
但这里的问题是,如果有重复的文本,那么它只会被计算一次。所以,您可能想使用

sum(line_A in text_B for line_A in text_A) / len(text_A)
但是如果
行A
可以位于
行B
中的任何位置,那么您所拥有的是正确的,并且可以这样简洁地编写

len(set(text_A) & set(text_B)) / len(text_A)
sum(any(line_A in line_B for line_B in text_B) for line_A in text_A)/len(text_A)

如果我对你的问题理解正确,这可能会有帮助:

from collections import Counter

>>> text_a = 'some text'
>>> a = Counter(text_a.split())
>>> text_b = 'other text'
>>> b = Counter(text_b.split())
>>> a & b
Counter({'text': 1})

如果我对你的问题理解正确,这可能会有帮助:

from collections import Counter

>>> text_a = 'some text'
>>> a = Counter(text_a.split())
>>> text_b = 'other text'
>>> b = Counter(text_b.split())
>>> a & b
Counter({'text': 1})

我不太明白第三个。如果第二个解决方案不匹配,它在哪里工作?@wils484第二个解决方案将匹配精确的行,但第三个解决方案将匹配,即使
line\u A
line\u B
的子字符串。是的,我的代码完成了我需要它完成的任务。
text_A=['ab','cd']
text_B=['abab','cdab','cd']
的正确输出应为2/2=
1
。我喜欢简洁的版本,谢谢。我不太明白第三个版本。如果第二个解决方案不匹配,它在哪里工作?@wils484第二个解决方案将匹配精确的行,但第三个解决方案将匹配,即使
line\u A
line\u B
的子字符串。是的,我的代码完成了我需要它完成的任务。
text_A=['ab','cd']
text_B=['abab','cdab','cd']
的正确输出应为2/2=
1
。我喜欢简洁的版本,谢谢。
A行在B行中
-你真的是指那里的
?如果文本A有一行
ham
,文本B有一行
hamburger
,是否将其作为匹配项计算?(如果是这样的话,您是否从字符串的末尾删除了换行符?@user2357112是的,它是原型的一部分,
中的
将替换为更健壮的匹配
行中的a行中的B行中的
-您真的是指
中的
?如果文本A有一行
ham
,文本B有一行
hamburger
,是否将其作为匹配项计算?(如果是这样,您是否已从字符串末尾删除了换行符?@user2357112是的,它是原型的一部分,
中的
将替换为更健壮的匹配