まず、Pythonプログラマーに共通のアンチパターンを示しています。インデックスをループせず、オブジェクト自体をループします。例えば:
for item in b:
do_something(item)
それよりも:
for i in range(len(b)):
do_something(b[i])
それはより明確で、より単純で、より速いです。
とはいえ、あなたが抱えている主な問題は、アイテムの1つがリストではないため、長さがないことです。
ここでのより良いオプションは、ジェネレータ式とでリストをフラット化してから、組み込み関数itertools.chain.from_iterable()
を使用して要素を合計することです。sum()
>>> import collections
>>> import itertools
>>> b = [[1,2], [3,4], [5,6], 1]
>>> list(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
[1, 2, 3, 4, 5, 6, 1]
>>> sum(itertools.chain.from_iterable(item if isinstance(item, collections.Iterable) else [item] for item in b))
22
反復不可能なアイテムを処理しないため、ジェネレータ式が必要なitertools.chain()
ので、これを回避するためにリストに任意のアイテムを配置します。
別の方法は、独自のジェネレーターを作成することです。
def chain_mixed(iterable):
for item in iterable:
try:
for subitem in item:
yield subitem
except TypeError:
yield item
次に、次のことを簡単に行うことができます。
sum(chain_mixed(b))