Python:如何将一个列表和一个列表列表一起映射

时间:2013-11-18 13:59:52

标签: python list map zip list-comprehension

所以我试图通过map()摆脱一些嵌套循环,并且遇到特定情况的麻烦。

我有两个清单:

List1 = [1,2,3,4,5]

List2 = [[1,2,3],[5],[1,6],[1,0,9,10],[1,5,2]]

所以基本上list1和list2的长度相同,但是list2是变量长度列表的列表。

我想调用相当于;

的某个函数

(1,1),(1,2),(1,3),(2,5),(3,1),(3,6),(4,1),(4,0) ,(4,9)(4,10),(5,1),(5,5),(5,2)

使用地图。元组的第一个参数来自List1,第二个参数来自list2上list1的第i个,扩展了子列表。

所以现在我有:

map(function,zip(list1,list2))

但我看不出如何扩展list2以获得我刚才描述的内容。我认为它可能涉及列表理解,但我遇到了一些麻烦,而且反复试验并没有让我走得太远。

另一个问题是,如果这个嵌套循环中的内部函数容易被调用数百万次,map()会明显快于for循环吗?

3 个答案:

答案 0 :(得分:4)

简单的列表理解,像这样

list1 = [1, 2, 3, 4, 5]
list2 = [[1, 2, 3], [5], [1, 6], [1, 0, 9, 10], [1, 5, 2]]
print [(item1, s) for item1, item2 in zip(list1, list2) for s in item2]

<强>输出

[(1, 1), (1, 2), (1, 3), (2, 5), (3, 1), (3, 6), (4, 1), (4, 0), (4, 9), (4, 10), (5, 1), (5, 5), (5, 2)]

这个oneliner只是

的简短版本
result = []
for item1, item2 in zip(list1, list2):
    for s in item2:
        result.append((item1, s))

答案 1 :(得分:0)

列表推导或lambda函数可以提供帮助,但解决方案过于冗长且难以理解。可能一个天真的循环更好?

def join(list1, list2):
    for head, tail in zip(list1, list2):
        for thing in tail:
            yield (head, thing)

这是一台发电机。您可以通过以下方式使用它:

pairs = join(list1, list2)
for pair in pairs:
    # do anything with pair

或者您想将此权限存储在内存而不是此增量生成器中?

答案 2 :(得分:0)

使用itertools的解决方案(内存中没有临时列表):

from itertools import *
a = chain.from_iterable( product([i], j) for i, j in izip( List1, List2 ) )

您可以使用以下命令在列表中对其进行转换:

list(a)

或者只是使用循环来遍历元素。