2013-03-16 96 views
-1

我有2個列表a = [2, 6, 12, 13, 1, 4, 5]b = [12, 1]。列表b中的元素是列表a的子集。Python - 從列表中生成元組

從上面的一對列表,我需要創建元組的列表如下:基本上

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

,在列表b和列表a的交點,所以從上方例如ab第一個交點位於索引2,值爲12。因此,使用列表b中的第一個元素和列表a中的第二個元素創建一個元組。我正在python中嘗試這個,有效地創建這個元組的任何建議?請注意,每個列表可以包含100個元素。

+2

對不起,我不知道你需要什麼......兩個列表的交點是什麼? – rodrigo 2013-03-16 11:20:40

+0

@rodrigo,我現在編輯它。讓我知道現在是否清楚? – Swati 2013-03-16 11:23:45

+0

現在我明白了! :) – rodrigo 2013-03-16 11:41:38

回答

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 2013-03-17 13:44:45

+0

列表理解實際上是_syntactic sugar_ for一個循環。也許有一些額外的優化機會,但我不會指望它。你可以使用列表生成器(使用'()'而不是'[]'來理解內存),這可能會對很長的列表產生影響(但只有100個元素)。關於時間差異,你會必須簡介。 – rodrigo 2013-03-17 20:55:42

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 2013-03-16 11:28:45

+0

@Swati我也添加了一個基於列表理解的解決方案。 – 2013-03-16 11:30:38

+0

好的,謝謝你,一個問題,因爲我的列表b將包含列表a中的全部或子集元素。任何解決方案來自列表a本身的輸出。 – Swati 2013-03-16 11:38:31