Python的:如何映射一个列表,列表中的一个列表一起(Python: how to map one

2019-10-19 00:41发布

所以我想打通地图去掉一些嵌套循环的(),并与特定的情况下麻烦。

我有两个列表:

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循环显著快?

Answer 1:

它与列表解析简单,像这样

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))


Answer 2:

列表解析或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

或者你想,而不是存储这个增量发生器的记忆中这对吗?



Answer 3:

使用itertools的溶液(无临时列表在存储器中):

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

您可以使用列表转换这样的:

list(a)

或者步行使用一个循环的元素。



文章来源: Python: how to map one list and one list of list together