2013-03-16 3 views
-1

나는 a = [2, 6, 12, 13, 1, 4, 5]b = [12, 1]의 2 개의 목록이 있습니다. 목록 b의 요소는 목록 a의 하위 집합입니다. 목록의 위의 쌍에서 Python - 목록에서 터플 생성

, 나는 다음과 같은 튜플의 목록을 작성해야합니다,

[(12,6),(12,2),(1,13),(1,12),(1,6),(1,2)] 

을 기본적으로 목록 b 및 목록 a의 교차점에서 예를 들어 ab 위에서 그렇게 첫 번째 교차점은 2이고 값은 12입니다. 따라서 목록 b의 첫 번째 요소와 목록 a의 두 번째 요소가있는 튜플을 만듭니다. 파이썬에서 이것을 시도하고 있는데,이 튜플을 효율적으로 생성하기위한 제안은 무엇입니까? 각 목록에는 100 개의 요소가있을 수 있습니다.

+2

죄송합니다. 필자가 필요로하는 것을 언급하지 않았습니다 ... 두 목록의 교차점 _은 무엇입니까? – rodrigo

+0

@rodrigo, 지금 편집했습니다. 지금 그것이 명확한 지 알려주시겠습니까? – Swati

+0

이제 알겠습니다! :) – rodrigo

답변

1

무엇 이것에 대해 :

a = [2, 6, 12, 13, 1, 4, 5] 
b = [12, 1] 

sum([ [ (bb,aa) for aa in a[0:a.index(bb)]] for bb in b], []) 

결과는 다음과 같습니다

[(12, 2), (12, 6), (1, 2), (1, 6), (1, 12), (1, 13)] 

예에서는 원래 순서대로 목록을 반환하지만 예제에서는 목록을 반대로 반환합니다. 문제가있는 경우 쉽게 되돌릴 수 있습니다.

+0

중첩 된 for 루프에서 목록 이해가 얼마나 다른가요? 그리고 시간에이 알고리즘의 효율성은 무엇입니까? – Swati

+0

목록 이해는 실제로 루프의 _syntactic sugar_입니다. 어쩌면 몇 가지 추가 최적화 기회가있을 수 있지만 그럴 가치는 없습니다. 목록 생성기를 사용하여 메모리를 절약 할 수 있습니다 ('[] '대신'()'로 이해할 수 있으며, 매우 긴 목록 (단 100 개 요소가 아닌)과 다를 수 있습니다. 프로파일 링해야합니다. – rodrigo

2

나는 이것이 당신이 원하는 생각 :

In [11]: a=[2,6,12,13,1,4,5] 

In [12]: b=[12,1] 

In [13]: ans=[] 

In [14]: for x in b: 
    ind=a.index(x)  #find the index of element in a 
    for y in a[:ind]: #iterate up to that index and append the tuple to a new list 
     ans.append((x,y)) 
    ....:   

In [15]: ans 
Out[15]: [(12, 2), (12, 6), (1, 2), (1, 6), (1, 12), (1, 13)] 

list comprehension를 사용하여 :

In [16]: [(x,y) for x in b for y in a[:a.index(x)]] 
Out[16]: [(12, 2), (12, 6), (1, 2), (1, 6), (1, 12), (1, 13)] 
+1

예상되는 출력은 정확하지만 더 효율적인 방법을 찾고 있습니다. - for 중첩 된 루프가 없습니까? – Swati

+0

@ 스와 티 목록 이해력 기반 솔루션도 추가했습니다. –

+0

내 목록 b에는 목록 a의 요소 전부 또는 일부가 포함되어 있으므로 한 가지 질문 해 주셔서 감사합니다. 목록 자체에서 출력을 생성하는 모든 솔루션. – Swati