如何通过在每个索引中选择一个元素来组合列表?

问题描述 投票:0回答:1

我想知道如何做一个函数,接受两个列表,然后返回一个列表,其中包括通过从每个索引的列表中选择一个元素来组合这些列表的所有可能的组合。 我觉得我描述得不好,但我要找的是。

输入:['a','b'],['c','d']

output:['ab', 'ad', 'cb', 'cd']

我在这里做了一个半成功的函数。

def mix_list(lst1, lst2):
    res = []
    k = max(len(lst1), len(lst2))
    ref = itertools.product(range(2), repeat=k)

    for comb in list(ref):
        temp = [None] * k
        for i, e in enumerate(comb):
            if e == 0:
                try:
                    temp[i] = lst1[i]
                except IndexError:
                    temp[i] = lst2[i]
            elif e == 1:
                try:
                    temp[i] = lst2[i]
                except IndexError:
                    temp[i] = lst1[i]
        res.append(temp)
    return [''.join(i) for i in set(map(tuple, res))]

我的第一个想法是,itertools应该有一些函数可以实现这个功能, 但我找不到任何东西。 除此以外,我还在这里进行了一些google和搜索,但我一直没有找到能更快一点或者更简单一点实现我所寻找的功能的东西。

有没有更好的方法来完成这个任务,或者有一个库已经有了这样的功能?

python list iteration generator combine
1个回答
0
投票

你可以 zip() 将两个列表合并在一起,得到相应指数的值对列表,然后用 product() 来获得在每个索引中挑选一个元素的所有组合。

>>> lst1, lst2 = ['a','b'], ['c','d']
>>> list(product(*zip(lst1, lst2)))
[('a', 'b'), ('a', 'd'), ('c', 'b'), ('c', 'd')]

这可以很容易地扩展到任意数量和长度的列表, 但结果的大小将成倍增长。


0
投票

你必须将

['a','b'], ['c','d']

['a','c'], ['b','d']

(第一个列表的值为索引1,第二个列表的值为索引2)

再用 itertools.product()

import itertools 

a, b = zip(['a','b'], ['c','d'])
#print(a, b)  # ['a','c'], ['b','d']

data = itertools.product(a, b)

data = ["".join(item) for item in data]

print(data)

结果

['ab', 'ad', 'cb', 'cd']
© www.soinside.com 2019 - 2024. All rights reserved.