2016-10-22 4 views
1

가장 빠른 방법은 무엇입니까? 나는 목록의 목록을 가지고 있으며 각 하위 목록에서 특정 값을 찾기 위해 반복해야한다. 가치가 발견되면 다른 별도의 목록에 값을 추가 한 다음 찾은 값을 변경해야합니다. I는 각리스트 X 통해 I 루프 그래서리스트 목록이Python : 값과 일치하는 목록 목록을 반복하고 변경하십시오.

for x in f 
    if 'nan' in x: 
     ef.append(1.0) 
    else: 
     ef.append(0.0) 

F를 수행한다 시작 하위리스트의 요소 중 유모 값이 있는지 확인한다. 하위 목록 x의 요소 중 최소 하나의 값이있는 경우 1.0을 ef에 추가하지만 그렇지 않으면 0.0을 추가합니다. 이제이 작업을 수행해야하지만 동시에 각 하위 목록의 모든 값을 1.0으로 변경해야합니다. 그래서 나는 다시 반복해야한다이 루프에서이 작업을 수행 할 수있는 방법이 있나요

for x in f: 
    if 'nan' in x: 
     ef.append(1.0) 
     x[position of nans] = 1.0 
    else: 
     ef.append(0.0) 

처럼 뭔가를 원하거나? 저는 매우 많은 양의 데이터를 다루므로 최대한 빨리 유지하려고합니다.

답변

2

이와 같은 복잡성은 선형 적으로 모든 요소를 ​​한 번 이상 검사해야하기 때문에 더 잘할 수 없습니다. 한 번만 하위리스트 당 ef 목록에 1 또는 0를 추가하려는 가정이 같은 작동합니다 :

f = [[1, 'nan'], [2, 'nan', 'nan']] 
ef = [] 

for x in f: 
    found = False 
    for pos, e in enumerate(x): 
     if e == 'nan': 
      x[pos] = 1 
      found = True 
    ef.append(1 if found else 0) 

print f, ef 

live example on ideone here을. 내 노트북에

타이밍 (목록을 구축 포함) :

대신, 지능형리스트 사용하여 한 번 초기화 빠릅니다) (list.append를 사용
$ time python test.py 
numElements = 15000000 

real 0m1.908s 
user 0m1.879s 
sys 0m0.028s 
+1

안녕하세요, 저는 약간의 예제를 바꿨습니다. 질문에 'f'의 모든 항목에 대해''nan ''이 포함되어 있고''foo ' nan'' : http://ideone.com/Z4ee3h – HumanCatfood

+1

Thx, 예, 그렇습니다. 나는 1이 첨부 될 필요가있을 때의 질문에서 명확하지 않았습니다. 나는 OP가 그 자신을 알아낼 수 있다고 생각한다. 문제는 더 빠른 방법이 있는지에 관한 것이었다. :) –

+0

@ paul-g 네, 고맙습니다. 위의 포스터는 맞지만 당신의 대답은 정말로 나를 돕습니다. 나는 그 말을 조금 더 분명하게 바꾸었다. – Atirag

0

:

ef = [[item if item != 'nan' else 1 for item in list] for list in f] 

이것은 피할 수를 각 삽입 후에 목록의 끝을 찾아야하고, 더 미학적이다.

+0

흠 ...하지만 아이템이 나노에서 1로 바뀌지 않았습니까? 나는 nan이 발견 될 때마다 sublist에있는 항목을 1로 변경해야하고 각 목록의 많은 다른 항목에서 nan을 찾을 수 있어야합니다. ef는 각 하위 목록마다 하나의 항목 만 포함해야하며 발견 된 각 항목 당 하나의 항목 만 포함해야합니다. – Atirag

관련 문제