次のようなリストにタプルをネストしました
l = [(1, 'a', 'b'), (2, 'b', 'c'), (3, 'e', 'a')]
リスト内の「a」と「b」の合計数を知りたい。そのため、現在、次のコードを使用して結果を取得しています。
amount_a_and_b = len([None for _, elem2, elem3 in l if elem2 == 'a' or elem3 == 'b'])
しかし、私は得たamount_a_and_b = 1
ので、正しい答えを得る方法は?
また、これを行うためのよりエレガントな方法(コードが少ない、パフォーマンスが高い、または組み込みを使用している)はありますか?
リストをフラット化itertools.chain.from_iterable()
してcollections.Counter()
オブジェクトに渡します:
from collections import Counter
from itertools import chain
counts = Counter(chain.from_iterable(l))
amount_a_and_b = counts['a'] + counts['b']
またはsum()
、フラット化されたシーケンスに値が表示される回数をカウントするために使用します。
from itertools import chain
amount_a_and_b = sum(1 for v in chain.from_iterable(l) if v in {'a', 'b'})
2つのアプローチは、私のMacbook Pro(OS X 10.11)のPython3.5.1で速度がほぼ同等です。
>>> from timeit import timeit
>>> from collections import Counter
>>> from itertools import chain
>>> l = [(1, 'a', 'b'), (2, 'b', 'c'), (3, 'e', 'a')] * 1000 # make it interesting
>>> def counter():
... counts = Counter(chain.from_iterable(l))
... counts['a'] + counts['b']
...
>>> def summing():
... sum(1 for v in chain.from_iterable(l) if v in {'a', 'b'})
...
>>> timeit(counter, number=1000)
0.5640139860006457
>>> timeit(summing, number=1000)
0.6066895100011607
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加