2017-03-24 7 views
1

のは、私は3つのリストを持っているとint_listという名前のリストに整数であるすべての要素を追加したいとしましょう:if文の条件は複数の変数に対して相互排他的ですか?

test1 = [1, 2, 3, "b", 6] 
test2 = [1, "foo", "bar", 7] 
test3 = ["more stuff", 1, 4, 99] 
int_list = [] 

私は新しいリストにすべての整数を追加するには、次のコードを実行できることを知っている:

for elem1, elem2, elem3 in zip(test1, test2, test3): 
    if elem1 is int: 
     int_list.append(elem1) 
    if elem2 is int: 
     int_list.append(elem2) 
    if elem3 is int: 
     int_list.append(elem3) 

if文を1つの条件文にマージできますか?それともコードを少なくするか?これを行うもっとpythonicな方法がありますか? は、私は、次のコードを実行しようとしたが、それは整数ではありませんでした要素が含まれます:

for elem1, elem2, elem3 in zip(test1, test2, test3): 
     if (elem1 is int, elem2 is int, elem3 is int): 
      int_list.append(elem1) 
      int_list.append(elem2) 
      int_list.append(elem3) 
+0

これは** *動作しません。** zip'は、リストの1が終了した瞬間から停止しますので、 '... –

+0

はさらに' elem1がint'あり、それ自体**すべての整数を追加しません。 *。 –

答えて

2

一部あなたのコードに問題あります要素の

  1. zip構造タプル限りは、すべてのリストには要素があり、リストの1つが使い果たされた場合はzipが停止します。
  2. elem1 is intは型チェックをしない、それがをチェック参照の等価を行い、あなたはそのためのisinstance(..)を使用することができます。あなたが一つ以上の要素を持つタプルでそれをテストするので
  3. @Jean-FrançoisFabreが言うように、if (...)常にを成功します:かかわらず、そのタプルの値のtruthinessTrueです。

どうして最初にに参加するのですか??あなたはzipを使用していますが、itertools.chain()をしたい

int_list = [x for sublist in (test1,test2,test3) 
       for x in sublist if isinstance(x,int)] 
+0

「発電機の使用」の例に発電機がありません。 – user2357112

+0

@ user2357112:最初はジェネレータを使用してチェーンを張りたいと思っていましたが、途中で私は自分の考えを変えました。 –

+0

'(elem1はint、elem2はint、elem3はint)'は空でないタプルなので常に 'True'です。 –

2

for sublist in (test1,test2,test3): 
    for x in sublist: 
     if isinstance(x,int): 
      int_list.append(x) 

それとも、リストの内包表記を使用することができますようにあなたは、たとえば、リストのタプルを使用することができます。さらにyou should use isinstance to check class membership

from itertools import chain 

for elem in chain(test1, test2, test3): 
    if isinstance(elem, int): 
     int_list.append(elem) 
+0

これは素晴らしい感謝です! –

関連する問題