2014-04-01 4 views
1
def check(temp): 
    for i in temp: 
    if type(i) == str: 
     temp.remove(i) 

temp = ['a', 'b'] 
print(temp) ==> Output: ['a','b'] 
check(temp) 
print(temp) ==> Output: ['b'] 

를 사용하여 루프를 들어 =는 설명이 필요 - 파이썬 목록

임시로 실행하면 [ 'A', 1], 출력 [1]

온도 = [1, 'A', 'B', 'C'는 2, 출력은 [1, 'B',이다 2]

누군가가 그 결과를 평가하는 방법을 설명하기 위해 신경 수 .. Thnx

답변

5

반복하는 동안 당신은 목록을 수정하는 그것. 반복 중에 목록이 변경되기 때문에 요소를 건너 뜁니다. list.remove()으로 항목을 제거하면 해당 요소의 첫 번째 발생도 제거되므로 예기치 않은 결과가 발생할 수 있습니다.

목록에서 요소를 제거하는 표준 방법은 지금처럼 새로운 목록을 구성하는 것입니다

>>> def check(temp): 
... return list(x for x in temp if not isinstance(x, str)) 

을 또는 당신은 정기적으로 지능형리스트 반환 할 수 :

>>> def check(temp): 
...  return [x for x in temp if not isinstance(x, str)] 

당신이해야을 일반적으로 isinstance() 대신 type() 대신 형식을 테스트하십시오. type 예를 들어 상속에 대해 전혀 몰라.

예 :

>>> check(['a', 'b', 1]) 
[1] 

>>> check([ 1, 'a', 'b', 'c', 2 ]) 
[1, 2] 

>>> check(['a', 'b', 'c', 'd']) 
[] 
+0

일이 –

+0

@A श 위니 च haudhary 어떤 이유로 그것에 나를 이길뿐만 아니라 지능형리스트를 사용할 수 있습니다, 내 생각 방금 최근에 많은 생성기 표현을 작성했습니다. – msvalkon

+0

@eryksun 순전히 ipython'% timeit' 테스트는 ~ 200k 개 엘리먼트의리스트를 가지고 ~ 3-5 ns의 차이를 보여줍니다. 물론 느리지 만 시간의 절반은 내가 잘못한 타이밍이 아니라면 과장된 것처럼 보일 것입니다. – msvalkon

0

당신은 사용할 수

def check(temp): 
    return [i for i in temp if type(i)!=str] 

temp = [ 1, 'a', 'b', 'c', 2 ] 

print check(temp) 

출력 :

[1, 2] 

또는

def check(temp): 
    return [i for i in temp if not isinstance(i, str)] 

temp = [ 1, 'a', 'b', 'c', 2 ,"e",4,5,6,7] 

print check(temp) 

출력 :

[1, 2, 4, 5, 6, 7] 
0
 
>>> text = ['a', 'b', 1, {}] 
>>> filter(lambda x: type(x) == str, text) 
['a', 'b'] 

같은 기능이 될 것입니다 :

 
>>> def check(temp): 
...  return list(filter(lambda x: type(x) == str, temp)) 
... 
>>> check(text) 
['a', 'b']