计算列表列表中2个变量的共同出现

我有一个列表列表,每个列表包含字符串值(〜130.000个列表,每个列表都有〜15个项目)。列表可能包含重复项,但这是设计使然,它们需要保留=我在这里不能使用集合。

我创建每个列表值(〜5.600.000个元组)的元组组合,并希望计算每个元组值单独出现并一起出现在列表中的次数。

因此,我需要为每个元组值查找它们在列表中出现的次数。因此(5.600.000 *(130.000 * 15))......很多。

示例:

tags: [['a','b','c','aa','bb','2019'],['a','d','18','gb'],['aa','a','dd','fb','la'],'ddaa','k','l']]
tagSet: {('a','aa'),('a','b'),('b','d'),('aa','d')}

for tagTuple in tagSet:
    tagA = tagTuple[0]
    tagB = tagTuple[1]
    sumA = sum(tagA in item for item in tags )
    sumB = sum(tagB in item for item in tags )
    sumAB = ??

对于元组(a,b),结果应为

a: 3,b:2,a+b: 1

但是我如何计算a和b出现在每个列表中的次数?

由于我需要检查大量的列表和元组,因此需要一种高效的方法。

cxl13461615166 回答:计算列表列表中2个变量的共同出现

只需使用与if语句中相同的检测表达式:

sumAB = sum(tagA in item and tagB in item for item in tags )
,

tags列表中的每个元素出现的频率创建一个collections.Counter,并在dict中的Counter中创建一个from collections import Counter,defaultdict from itertools import combinations counts = Counter() co_counts = defaultdict(Counter) for lst in tags: c = Counter(lst) counts.update(c) for a,b in combinations(set(lst),2): co_counts[a][b] += min(c[a],c[b]) co_counts[b][a] += min(c[a],c[b]) 元素。

tags

创建它们也不是完全便宜的,但是比您当前正在做的便宜得多。如果您的tagSetN分别具有Mtags元素,并且K中的列表平均具有K元素({{ 1}}比NM小得多,那么它只有“ N * K²”,而不是N * M * K

然后,您可以直接从这些Counter字典中获取值。

for a,b in tagSet:
    print(a,b,counts[a],counts[b],co_counts[a][b])

这将提供以下输出:

a b 3 2 1
a aa 3 3 2
b d 2 2 1
a d 3 2 1
aa d 3 2 1
aa b 3 2 2
,

只需使用条件tagA in item and tagB in item

tags = [['a','b','c','aa','bb','2019'],['a','d','18','gb'],['aa','a','dd','fb','la'],'ddaa','k','l']]
#tagSet = {('a','aa'),('a','b'),('b','d'),('aa','d')}
tagSet = [('a','b')]

for tagTuple in tagSet:
    tagA = tagTuple[0]
    tagB = tagTuple[1]
    sumA = sum(tagA in item for item in tags )
    sumB = sum(tagB in item for item in tags )
    sumAB = sum(tagA in item and tagB in item for item in tags)
    print(sumA)
    print(sumB)
    print(sumAB)
本文链接:https://www.f2er.com/3032884.html

大家都在问