2017-03-24 2 views
1

의 나는 세 가지 목록을 가지고 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 문을 하나의 조건문에 병합 할 수 있습니까? 아니면 적은 코드로 만드시겠습니까? 이 작업을 수행 할 더 파이썬적인 방법이 있습니까? 는 다음 코드를 수행했지만,이 정수되지 않은 요소를 포함합니다 :

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' 목록 중 하나를 완료하는 순간부터 정지됩니다 '이후의 모든 정수 자체가 ... –

+0

는 또한'elem1이 int'됩니다 ** 작동하지 않습니다 추가하지 않습니다 * *. –

답변

2

일부 코드에 문제가 있습니다 요소의

  1. zip 구조 튜플 만큼이 모든 목록에는 요소가 있고, 목록 중 하나가 모두 소모되면 zip이 중지됩니다.
  2. elem1 is int유형 검사, 그것은을 확인 참조 평등, 당신은 그것에 대해 isinstance(..)을 사용할 수 있습니다 않습니다하지 않습니다; 및 @Jean-FrançoisFabre
  3. 는 하나 또는 그 이상의 요소가있는 튜플로 테스트 이후 if (...)항상을 성공 말한다 : 관계없이 튜플의 값의 truthinessTrue입니다.

왜 처음이 아니십니까? 그들과 합치다? 당신은 예를 들어 같은 목록의 튜플을 사용할 수 있습니다

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

또는 당신은 지능형리스트 사용할 수 있습니다

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'입니다. –

관련 문제