2013-08-04 2 views
1

두 개의리스트가 주어지면 첫 번째리스트의 모든 요소가 짝수 인덱스 (순서 유지)가되고 두 ​​번째리스트의 모든 요소가 홀수 인덱스가되도록 병합하려고합니다 그들의 순서를 유지함). 아래 예 :파이썬은 두리스트 (짝수/홀수 요소)를 병합합니다.

x = [0,1,2] 
y = [3,4] 

result = [0,3,1,4,2] 

for 루프를 사용하면됩니다. 그러나 나는이 일을하는 공상적인 비단뱀 방식이있을 수 있다고 생각한다. for-loop를 작성하는 더 좋은 해결책이 있습니까?

편집 : 목록 작성에 대해 생각하고 있었지만 지금까지 해결 방법이 없었습니다.

+0

당신이'X = [0,1,2,3,4,5,6]'그러나'Y에 대해 수행 무엇을 하시겠습니까? = [20,21]', 또는 그 반대로? (즉, 한 목록이 다른 것보다 훨씬 길거나 짧 으면 어떨까요?) – torek

+0

쉬운 시나리오를 가정합니다. len (x) == len (y) 또는 len (x) == len (y) + 1, 그것에 대해 걱정하지 마십시오. 게임을위한 일련의 움직임이 될 것입니다. – ducin

+0

그럴 경우 아래와 같이 'roundrobin'또는 단순화 된 버전으로 이동하십시오. – torek

답변

3

당신은 간단하게 수행 할 수 있습니다

for i,v in enumerate(y): 
    x.insert(2*i+1,v) 

이 그것이 overpassed 때 마지막 인덱스를 사용합니다 삽입을 이용합니다.

일례 : 이것은 간단하다

x = [0,1,2,3,4,5] 
y = [100, 11,22,33,44,55,66,77] 
print x 
# [0, 100, 1, 11, 2, 22, 3, 33, 4, 44, 5, 55, 66, 77] 
+2

나는 단순함 때문에이 것을 좋아한다. 수정해야 할 것은 x를 수정하지 않는 것이다. 열거 형 (y)에서 i, v에 대해'res copy.copy (x)'/':'/'res.insert (2 * i + 1, v)' – ducin

+3

@tkoomzaaskz'list.insert '는 O (N) 연산입니다. –

+0

@AshwiniChaudhary 당신은 복잡성을 의미합니까? 그래서? (미안 내가 너의 요점을 이해하지 못한다면) – ducin

7

다음은 사용할 수있는 것입니다. 좋아

>>> from itertools import chain 
>>> from itertools import zip_longest 
>>> list(filter(lambda x: x != '', chain.from_iterable(zip_longest(x, y, fillvalue = '')))) 
[0, 3, 1, 4, 2] 

이 임의의 길이의 목록에 대한 작업 (Py2x에 대한 list(izip_longest(...))를 사용하는) 다음 - 그것에

>>> x = [0, 1, 2, 3, 4] 
>>> y = [5, 6] 
>>> list(filter(lambda x: x != '', chain.from_iterable(zip_longest(x, y, fillvalue = '')))) 
[0, 5, 1, 6, 2, 3, 4] 

설명이 일하고있어 - 채우기 값

  1. zip_longest(...)는 목록을 참아 요 동일하지 않은 길이의 iterables에 대해 지정된 채우기 값을 채 웁니다. 따라서 원래의 예제에서는 다음과 같이 평가됩니다. [(0, 3), (1, 4), (2, '')]
  2. 이 메서드는 튜플 목록을 제공하므로 결과를 병합해야합니다. 이를 위해 우리는 [0, 3, 1, 4, 2, ''] 같은 것을주는 chain.from_iterable(...)을 사용합니다.
  3. ''의 모든 항목을 제거하려면 filter(...)을 사용하고 필요한 답변을 얻습니다.
+0

for len (x) = len (y) +1 :'list (chain.from_iterable (zip (x, y)))) + [x [-1]]' – Muposat

4

이 시도 :

x = [0,1,2,10,11] 
y = [3,4] 

n = 2*max([len(x),len(y)]) 
res = n *[None] 
res[:2*len(x):2] = x 
res[1:2*len(y):2] = y 
res = [x for x in res if x!=None] 
print res 

이 고르지 긴 목록을 위해 작동합니다.

5

사용 roundrobinrecipeitertools에서 :

from itertools import cycle, islice 
def roundrobin(*iterables): 
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C" 
    # Recipe credited to George Sakkis 
    pending = len(iterables) 
    nexts = cycle(iter(it).next for it in iterables) 
    while pending: 
     try: 
      for next in nexts: 
       yield next() 
     except StopIteration: 
      pending -= 1 
      nexts = cycle(islice(nexts, pending)) 
>>> list(roundrobin(x,y)) 
[0, 3, 1, 4, 2] 
2

하지 거의가요 roundrobin로하지만 :

def paired(it1, it2): 
    it2 = iter(it2) 
    for item in it1: 
     yield item 
     yield next(it2) 

는 2.7.5 시험 : 멈출

>>> x = [0, 1, 2] 
>>> y = [3, 4] 
>>> print list(paired(x, y)) 
[0, 3, 1, 4, 2] 

하는 것으로 목록 y이 만료되는 즉시 (next(it2) StopIteration을 발생시킵니다.당신은 같은 길이의 목록이있는 경우

+0

네,하지만 질문에 썼 듯이 for-loop만으로도 할 수 있습니다. 나는 신택스 기반 (목록 조각이나 목록 내물 같은)에 대해 생각하고 있었다. 어쨌든, 덕분에 – ducin

+0

이것은'paired (y, x)'와 같은 몇몇 아이템을 놓칠 것이다. –

+0

@AshwiniChaudhary : 그 이유는 하나의 목록이 다른 목록보다 길 때 무엇을해야하는지에 대해 위에 질문 한 이유입니다. – torek

3

, 당신은이를 사용할 수 있습니다

result = [ item for tup in zip(x,y) for item in tup ] 
1

는 그것은 슬라이스 수행 할 수 있습니다. 터미널에서 countslice를 수행

>>> list1=['Apple','Mango','Orange'] 
>>> list2=['One','Two','Three'] 
>>> list = [None]*(len(list1)+len(list2)) 
>>> list[::2] = list1 
>>> list[1::2] = list2 
>>> list 

출력 :

['Apple', 'One', 'Mango', 'Two', 'Orange', 'Three']