创建不同列表的元组列表
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')]
假设我有以下三个列表(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')]