2017-12-16 12 views
1

ネストされたリストの最初の要素を取得し、値を合計しようとしています。ネストされたリストの最初の要素の合計

など。

nested_list = [[1, 'a'], [2, 'b'], [3, 'c'], [4, 'd']] 
print sum(i[0] for i in nested_list) 

はしかし、私はこれをコーディングすることができ、より良い方法であるか疑問に思う代わりにリスト内の最初の要素None

nested_list = [[1, 'a'], [None, 'b'], [3, 'c'], [4, 'd']] 
new = [] 
for nest in nested_list: 
    if not nest[0]: 
     pass 
    else: 
     new.append(nest[0]) 
print sum(nest) 

があるのですか?すべての

答えて

3

だけフィルタを、その後、Noneない値のため、この場合のテストで:

sum(i[0] for i in nested_list if i[0] is not None) 

ジェネレータ式(とリスト、辞書と設定内包)は、ネストされたforループの任意の数をとり、if文上記は次のものと等価です:

for i in nested_list: 
    if i[0] is not None: 
     i[0] # used to sum() 

これはあなた自身のコードを反映しています。 if not ...: passelseを使用するのではなく、私は実際に合計できる値のみを許可するようにテストを逆転しました。フィルタを追加するループが必要な場合は、forループまたはif文を左から右へネスト順に追加するか、andまたはorを使用して、単一のifフィルタに複数のテストをストリングするだけです。

特定のケースでは、if i[0]のテストでも十分です。これはNone0をフィルタリングしますが、後者の値はとにかく合計に違いをすることはないだろう。

sum(i[0] for i in nested_list if i[0]) 

あなたは既にループコードで独自のifテストでこれに近づきました。

3

まず、Pythonはありませんnullを持っている、などのJava、C#のは、JavaScriptのような言語でnullの同等はNoneです。

第2に、ジェネレータ式でフィルタを使用できます。最も一般的なはnumbersに確認することが考えられます:

from numbers import Number 

print sum(i[0] for i in nested_list if isinstance(i[0], Number))

Numberは通常、だから我々は、すべてのオブジェクトを追跡する必要はありません、我々はint秒、long秒、float秒、complex ESなどを受け入れていることを確認しますPythonの世界では数値である。

それはリストがサブリストが含まれていることも可能ですので、我々はまた、それをチェックすることができます

from numbers import Number 

print sum(i[0] for i in nested_list if i and isinstance(i[0], Number))
関連する問題