关于python:什么是Pythonic方式获取列表并将其他列表中的元素“分发”到子列表?

What's a Pythonic way of taking a list of lists and “distributing” elements from another list to the sublists?

我只学了不到两个星期的Python。所以,很抱歉,如果我完全误会了。

我一直在找大约五天的时间,因为我一直在学习这个问题的答案的语言,而且措辞很难表达出来,所以如果我错过了,请随意标记为副本,并指出正确的方向。

假设我有list1 = [[x, y], [a, b]]list2 = [0, 1]

我要list3 = [[x, y, 0], [x, y, 1], [a, b, 0], [a, b, 1]]

在我对StackOverflow的研究和我自己的实验中,我发现了获得类似结果的方法,比如:

[[x, y, 0], [a, b, 1]]

[[x, y, 0, 1], [a, b, 0, 1]]

[[x, y, 0, 1], [a, b]]

[[[x, y], 0], [[x, y], 1], [[a, b], 0], [[a, b], 1]]

我一直在考虑的事情是做如下的事情:

  • 在列表1中创建尽可能多的子列表迭代列表2中的元素[[x, y], [a, b]] -> [[x, y], [x, y], [a, b], [a, b]]
  • 展平列表1,使其不再是子列表,而是重复元素[[x, y], [x, y], [a, b], [a, b]] -> [x, y, x, y, a, b, a, b]
  • 浏览列表1的元素并插入沿扁平列表[x, y, x, y, a, b, a, b] -> [x, y, 0, x, y, 1, a, b, 0, a, b, 1]的列表2
  • 将元素分组到合适的尺寸:[x, y, 0, x, y, 1, a, b, 0, a, b, 1] -> [[x, y, 0], [x, y, 1], [a, b, 0], [a, b, 1]]
  • 如果这就是我必须要做的,那就是我必须做的,我正在寻找一种方法来做到这一点,但我觉得必须有某种更像Python的方法来做这个手术(然后,我又知道什么?)如果是这样的话,我正在努力找出它可能是什么。


    在其核心,这只是两个列表的交叉乘积。

    1
    2
    3
    >>> import itertools
    >>> list(itertools.product(list1, list2))
    [(['x', 'y'], 0), (['x', 'y'], 1), (['a', 'b'], 0), (['a', 'b'], 1)]

    剩下要做的就是展平每个元组。

    1
    2
    >>> [x + [y] for x,y in itertools.product(list1, list2)]
    [['x', 'y', 0], ['x', 'y', 1], ['a', 'b', 0], ['a', 'b', 1]]


    仅使用列表理解:

    1
    list3 = [list[:] + [elem] for list in list1 for elem in list2]


    我可能错了,但我认为没有一个很好的ITertools解决方案

    1
    2
    3
    4
    5
    6
    7
    8
    def permutations(a,b):
        for sublist in a:
            for value in b:
                yield sublist + [value]

    list1 = [[x, y], [a, b]]
    list2 = [0, 1]
    print(list(permutations(list1, list2)))