所以我想打通地图去掉一些嵌套循环的(),并与特定的情况下麻烦。
我有两个列表:
list1的= [1,2,3,4,5]
列表2 = [[1,2,3],[5],[1,6],[1,0,9,10],[1,5,2]
所以基本上列表1和表2是相同的长度,但清单2是可变长度的名单列表。
我想呼吁的相当于某些功能;
(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)
使用地图。 该元组的第一个参数是从列表1,第二个是从列表1的上list2中第i个等价的,与所述子列表扩展。
所以现在我有:
图(功能,拉链(列表1,列表2))
但我不能看我怎么可能会扩大列表2得到我刚才所描述的。 我想这可能涉及到列表内涵,但我有一个小麻烦和反复试验没有得到我很远。
另一个问题是,如果在这个嵌套循环内的功能是容易被调用数百万次,将映射()不仅仅是一个for循环显著快?
它与列表解析简单,像这样
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))
列表解析或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
或者你想,而不是存储这个增量发生器的记忆中这对吗?
使用itertools的溶液(无临时列表在存储器中):
from itertools import *
a = chain.from_iterable( product([i], j) for i, j in izip( List1, List2 ) )
您可以使用列表转换这样的:
list(a)
或者步行使用一个循环的元素。