所以我试图通过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循环吗?
答案 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)
或者只是使用循环来遍历元素。