创建不同列表的元组列表

Creating a list of tuples of different lists

假设我有以下三个列表(l1、l2、l3)。如何创建一个新列表,其中每个元素都是列表元素的元组 (l_desired)?它实际上是 python.

中 zip 方法的扩展版本

简单来说,给定 l1, l2, l3,我该如何创建 l_desired

l1 = [1,2,3]
l2 = ['a', 'b', 'c']
l3 = ['Jess', 'Muss']

l_desiered = [(1, 'a', 'Jess'), (1, 'b', 'Jess'), (1, 'c', 'Jess'), 
              (1, 'a', 'Muss'), (1, 'b', 'Muss'), (1, 'c', 'Muss'), 
              (2, 'a', 'Jess'), (2, 'b', 'Jess'), (2, 'c', 'Jess'), ...]

`

如果顺序无关紧要,您可以使用 itertools:

from itertools import product


l1 = [1,2,3]
l2 = ['a', 'b', 'c']
l3 = ['Jess', 'Muss']
l_desired = list(product(l1,l2,l3))

输出:

[(1, 'a', 'Jess'), (1, 'a', 'Muss'), (1, 'b', 'Jess'), (1, 'b', 'Muss'), (1, 'c', 'Jess'), (1, 'c', 'Muss'), (2, 'a', 'Jess'), (2, 'a', 'Muss'), (2, 'b', 'Jess'), (2, 'b', 'Muss'), (2, 'c', 'Jess'), (2, 'c', 'Muss'), (3, 'a', 'Jess'), (3, 'a', 'Muss'), (3, 'b', 'Jess'), (3, 'b', 'Muss'), (3, 'c', 'Jess'), (3, 'c', 'Muss')]

使用itertools.product从一组列表中获取笛卡尔积(所有可能的值组合)

import itertools
l1 = [1, 2, 3]
l2 = ['a', 'b', 'c']
l3 = ['Jess', 'Muss']
for element in itertools.product(l1, l2, l3):
    print(element)

或者您可以使用列表理解

[element for element in itertools.product(l1, l2, l3)]

或者试试这个,

list(itertools.product(l1, l2, l3))

您也可以通过 list comprehension:

不导入 itertools 来简单地执行此操作
l1 = [1,2,3]
l2 = ['a', 'b', 'c']
l3 = ['Jess', 'Muss']

最后:

l_desiered=list(((x,y,z) for x in l1 for y in l2 for z in l3))

现在如果你打印 l_desired 你会得到你想要的输出

嵌套 for 循环:

l1 = [1,2,3]
l2 = ['a', 'b', 'c']
l3 = ['Jess', 'Muss']
out = []
for l in l1:
    for l_2 in l2:
        for l_3 in l3:
            out.append((l, l_2, l_3))
print(out)
'''
[
(1, 'a', 'Jess'), (1, 'a', 'Muss'), (1, 'b', 'Jess'),
(1, 'b', 'Muss'), (1, 'c', 'Jess'), (1, 'c', 'Muss'), 
(2, 'a', 'Jess'), (2, 'a', 'Muss'), (2, 'b', 'Jess'), 
(2, 'b', 'Muss'), (2, 'c', 'Jess'), (2, 'c', 'Muss'), 
(3, 'a', 'Jess'), (3, 'a', 'Muss'), (3, 'b', 'Jess'), 
(3, 'b', 'Muss'), (3, 'c', 'Jess'), (3, 'c', 'Muss')
]'''

如果这对您很重要,这将产生与 l_desired 相同的输出,否则 itertools.product 解决方案更简洁。

示例:

from pprint import pprint

l1 = [1,2,3]
l2 = ['a', 'b', 'c']
l3 = ['Jess', 'Muss']

l_desired = [
    (l1_elem, l2_elem, l3_elem)
    for l1_elem in l1
    for l3_elem in l3
    for l2_elem in l2
]

pprint(l_desired)

输出:

[(1, 'a', 'Jess'),
 (1, 'b', 'Jess'),
 (1, 'c', 'Jess'),
 (1, 'a', 'Muss'),
 (1, 'b', 'Muss'),
 (1, 'c', 'Muss'),
 (2, 'a', 'Jess'),
 (2, 'b', 'Jess'),
 (2, 'c', 'Jess'),
 (2, 'a', 'Muss'),
 (2, 'b', 'Muss'),
 (2, 'c', 'Muss'),
 (3, 'a', 'Jess'),
 (3, 'b', 'Jess'),
 (3, 'c', 'Jess'),
 (3, 'a', 'Muss'),
 (3, 'b', 'Muss'),
 (3, 'c', 'Muss')]

其他人已经说过,使用itertools.product():

>>> l1 = [1,2,3]
>>> l2 = ['a', 'b', 'c']
>>> l3 = ['Jess', 'Muss']
>>> list(itertools.product(l1, l2, l3))
[(1, 'a', 'Jess'), (1, 'a', 'Muss'), (1, 'b', 'Jess'), (1, 'b', 'Muss'), (1, 'c', 'Jess'), (1, 'c', 'Muss'), (2, 'a', 'Jess'), (2, 'a', 'Muss'), (2, 'b', 'Jess'), (2, 'b', 'Muss'), (2, 'c', 'Jess'), (2, 'c', 'Muss'), (3, 'a', 'Jess'), (3, 'a', 'Muss'), (3, 'b', 'Jess'), (3, 'b', 'Muss'), (3, 'c', 'Jess'), (3, 'c', 'Muss')]

要达到您问题中指定的排序顺序,您可以这样对结果进行排序:

>>> from operator import itemgetter
>>> sorted(itertools.product(l1, l2, l3), key=itemgetter(0,2,1))
[(1, 'a', 'Jess'), (1, 'b', 'Jess'), (1, 'c', 'Jess'), (1, 'a', 'Muss'), (1, 'b', 'Muss'), (1, 'c', 'Muss'), (2, 'a', 'Jess'), (2, 'b', 'Jess'), (2, 'c', 'Jess'), (2, 'a', 'Muss'), (2, 'b', 'Muss'), (2, 'c', 'Muss'), (3, 'a', 'Jess'), (3, 'b', 'Jess'), (3, 'c', 'Jess'), (3, 'a', 'Muss'), (3, 'b', 'Muss'), (3, 'c', 'Muss')]