2013-08-12 2 views
1

고정 길이 다중 목록을 병합하여 특정 위치에서 가장 업데이트 된 값을 가진 단일 목록을 얻는 방법. 아래 예에서 결과는 [1,33,222,3333,11111]입니다.고정 길이 다중 목록 병합

l1 = [1, "", 111, "", 11111] 
l2 = ["", 22, 222, 2222, ""] 
l3 = ["", 33, "", 3333, ""] 
l4 = .... 
l5 = ... 
.... 

이 작업을 수행하는 내장 된 기능이 있습니까? 나는 두 개의 루프를 사용하여 그것을 할 수 있지만 튜플에 다른 스마트 당신은 zip(l1, l2, l3) 사용할 수있는 동일한

답변

5

을 할 수있는 방법 다음 or 운영자가 있어야합니다 :

[tup[2] or tup[1] or tup[0] for tup in zip(l1, l2, l3)] 

or 운영자는 최초의 진정한 값을 반환합니다. 마지막 참값을 원하기 때문에 터플 요소에 or 연산자를 역순으로 적용해야합니다.

또는 당신은 역으로 목록을 zip, 순서대로 or 연산자를 사용할 수 있습니다 :

[tup[0] or tup[1] or tup[2] for tup in zip(l3, l2, l1)] 

이 업데이트 :

대신 목록의 다양한 수의, 내가 당신을 제안 대신 list of list이 있어야합니다. 이 경우이 같은 결과를 얻을 수 있습니다

다른 방법은 인수 시리즈의 첫 번째 공백이 아닌 항목을 얻을 수 map 및 기능을 사용
li = [[1, "", 111, "", 11111], 
     ["", 22, 222, 2222, ""], 
     ["", 33, "", 3333, ""], ..... so on 
    ] 

print [reduce(lambda a, b: a or b, tup) for tup in zip(*li[::-1])] 
+0

감사합니다. 그러나 나는 – learner

+0

@learner를 언급하는 것을 잊어 버린 목록이 다양합니다. 업데이트를 확인하십시오. –

+0

감사합니다. 그것은 정말로 더 어려운 해결책입니다. – learner

0

:

def first_nonblank(*args): 
    for item in args: 
     if item is not '': 
      return item 

print map(first_nonblank, l3, l2, l1) 

또는

print map(first_nonblank, *li[::-1]) 

li의 목록은 @Rohit Jain의 대답과 같은 목록입니다.