直接计数,而不是增量计数解决方案

这会产生 3 个列表之间元组频率的计数,是否可以通过直接计数而不是增量计数(不是+=)来完成?


为了澄清起见,我想解决必须使用+=并直接将计数应用于相应对来增加每次迭代的键值


from collections import defaultdict

from itertools import combinations


dd = defaultdict(int)


L1 = ["cat", "toe", "man"]

L2 = ["cat", "toe", "ice"]

L3 = ["cat", "hat", "bed"]


for L in [L1, L2, L3]:

    for pair in map(frozenset, (combinations(L, 2))):

        dd[pair] += 1

defaultdict(int,

            {frozenset({'cat', 'toe'}): 2,

             frozenset({'cat', 'man'}): 1,

             frozenset({'man', 'toe'}): 1,

             frozenset({'cat', 'ice'}): 1,

             frozenset({'ice', 'toe'}): 1,

             frozenset({'cat', 'hat'}): 1,

             frozenset({'bed', 'cat'}): 1,

             frozenset({'bed', 'hat'}): 1})


牧羊人nacy
浏览 126回答 1
1回答

波斯汪

计数不会存储在任何地方,因此迭代是不可避免的。但是您可以使用collections.Counter生成器表达式来避免显式for循环:from collections import Counterfrom itertools import chain, combinationsL1 = ["cat", "toe", "man"]L2 = ["cat", "toe", "ice"]L3 = ["cat", "hat", "bed"]L_comb = [L1, L2, L3]c = Counter(map(frozenset, chain.from_iterable(combinations(L, 2) for L in L_comb)))结果:Counter({frozenset({'cat', 'toe'}): 2,         frozenset({'cat', 'man'}): 1,         frozenset({'man', 'toe'}): 1,         frozenset({'cat', 'ice'}): 1,         frozenset({'ice', 'toe'}): 1,         frozenset({'cat', 'hat'}): 1,         frozenset({'bed', 'cat'}): 1,         frozenset({'bed', 'hat'}): 1})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python