4

Countersのリストの結合を見つけるための (読みやすさと効率の点で) 最良の方法は何ですか?

たとえば、私のリストは次のようになります。

counters = [Counter({'a': 6, 'b': 3, 'c': 1}),
            Counter({'a': 2, 'b': 5}),
            Counter({'a': 4, 'b': 4}),
            ...]

ユニオン、つまりを計算したいcounters[0] | counters[1] | counters[2] | ...

それを行う1つの方法は次のとおりです。

def counter_union(iterable):
    return functools.reduce(operator.or_, iterable, Counter())

より良いアプローチはありますか?

4

3 に答える 3

7

Python プログラマーが簡単なループを恐れるようになったのはいつですか? 笑。

result = Counter()
for c in counters:
    result |= c

物事を理論的に可能な限り少ない文字に押しつぶしても、実際には賞品はありません。まあ、Perl にはありますが、Python にはありません ;-)

後で: user2357112 のコメントに従って、Python 3.3 以降、上記のコードはresult. つまり、result真に再利用され、反復ごとに大きくなる可能性があります。

どのスペルでも

counters[0] | counters[1] | counters[2] | ...

代わりに、これまでの部分的な結果全体が、次の部分的な結果が計算されるときに破棄され続けます。それは遅くなるかもしれませんし、そうでないかもしれません。

于 2013-09-17T01:32:20.560 に答える
2

ループの方がはるかに読みやすいと思います:

def counter_union(iterable):
    union = Counter()
    for counter in counters:
        union |= counter
    return union
于 2013-09-17T01:33:20.737 に答える