Python - 从列表中生成元组

问题描述:

我有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

这个怎么样:

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

我想这是你想要的东西:

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