如何在Python中将嵌套列表拆分成几个列表?

时间:2019-09-20 15:24:24

标签: python list nested

我的代码的输入格式如下:

第一行包含整数 n 。 接下来的 n 行包含由空格分隔的整数的列表。

我需要的是将每行的元素转换为一个列表,然后计算这些列表的笛卡尔积。因此,我到达了将每一行的元素转换为列表并将列表存储在“ mylist”中的位置。

但是,由于“ mylist”是一个嵌套列表,因此我确实知道如何计算每个元素的笛卡尔积。

from itertools import product
n = int(input())

mylist = []
for i in range(n):
    elem = list(map(int, input().split()))
    mylist.append(elem)
product = list(product(???))

例如,如果我输入的是:

2 # number of lists
1 2 3 # 1st list
4 5 6 # 2nd list

然后“ mylist”将变为:

my list = [[1, 2, 3], [4, 5, 6]]

并且我需要以下outupt(“ mylist”中2个列表的笛卡尔积):

[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

OBS:我不一定需要一个名为“ mylist”的变量。我只需要2条输入线的笛卡尔积。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以像使用product中的itertools

>>> l
[[1, 2, 3], [4, 5, 6]]
>>> import itertools
>>> list(itertools.product(*l))
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

答案 1 :(得分:1)

您描述的正是Cartedian product,在python中是由itertools库实现的。
使用itertools.product,您可以用单行代码解决问题:

import itertools
my_list = [[1, 2, 3], [4, 5, 6]]
list(itertools.product(*my_list))
# output: [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

或者等效地,使用列表理解:

list1, list2 = my_list
[(x,y) for x in list1 for y in list2]

可能的product实现如下:

def product(*my_list):
    l_tuple = map(tuple, my_list)
    result = [[]]
    for t in l_tuple:
        result = [a + [b] for a in result for b in t]
    for prod in result:
        yield tuple(prod)