3个列表之间的Python组合,其中一个依赖于一个列表

xghobddn  于 12个月前  发布在  Python
关注(0)|答案(5)|浏览(146)

我有两个列表,第三个列表依赖于第一个列表(如果l1是1,那么l3中要取的元素是11或111,如果l2是2,那么l3要取的元素是22或222)。

l1 = [1, 2]
l2 = [3, 4]

l3 = [[11, 111], [22, 222]] # the numbers are calculated for each element of l1

字符串
我想要的是创建一个组合,导致:

[(1,3,11), (1,3,111), (1,4,11), (1,4,111), (2,3,22), (2,3,222), (2,4,22), (2,4,222)]


你有什么建议吗?

qco9c6ql

qco9c6ql1#

这个怎么样?

tuples = []
for l1_index, a in enumerate(l1):
    for b in l2:
         for c in l3[l1_index]:
             tuples.append((a,b,c))
print(tuples)

>>> [(1, 3, 11), (1, 3, 111), (1, 4, 11), (1, 4, 111), (2, 3, 22), (2, 3, 222), (2, 4, 22), (2, 4, 222)]

字符串

6ju8rftf

6ju8rftf2#

l1和l3之间的关系并不清楚,但假设它只是位置关系,你可以使用zip()的嵌套理解来合并组合l1和l3:

[ (a,b,c) for a,ac in zip(l1,l3) for b in l2 for c in ac  ]

[(1, 3, 11), (1, 3, 111), (1, 4, 11), (1, 4, 111), (2, 3, 22), 
 (2, 3, 222), (2, 4, 22), (2, 4, 222)]

字符串

pxyaymoc

pxyaymoc3#

这将工作:

import itertools                                                                     

combo = list(itertools.chain(*[                                                          
    itertools.product([l1[i]], l2, l3[i])                                            
    for i in range(len(l1))                                                          
]))

字符串
这个循环遍历l1,对于每个第i个元素,它产生所有与该元素的组合,后跟l2中的任何一个和l3中的第i个列表中的任何一个。
itertools.chain调用合并组合所有组合列表也可以重写为列表解析:

combo3 = [
    e
    for i in range(len(l1))
    for e in itertools.product([l1[i]], l2, l3[i])
]


一个快速基准测试,包含所有长度为100、len(l3[i]) == 5和1000次迭代(code)的列表:

  • Your solution:4.92秒
  • itertools.chain:1.95s
  • 使用列表理解:2.13s
dy2hfwbg

dy2hfwbg4#

以下是我的尝试:

def combine_lists(l1, l2, l3):
    result = []
    for index, i in enumerate(l1):
        for j in l2:
            result.append((i, j, l3[index][0]))
            result.append((i, j, l3[index][1]))
    return result

字符串
运行以下命令会产生您所描述的结果:

l1 = [1, 2]
l2 = [3, 4]
l3 = [[11, 111], [22, 222]]

combination = combine_lists(l1, l2, l3)
print(combination)

ni65a41a

ni65a41a5#

谢谢大家!最后,我结束了这个:

combo = []
for i in range(len(l1)):
    for j in range(len(l2)):
        for k in range(len(l3[i])):
            combo.append((l1[i], l2[j], l3[i][k]))
            
combo

字符串

相关问题