【问题标题】:How to combine lists by choosing one element per index?如何通过为每个索引选择一个元素来组合列表?
【发布时间】:2020-08-21 21:23:59
【问题描述】:

我试图弄清楚如何创建一个包含两个列表的函数,然后返回一个列表,其中包含通过从每个索引的列表之一中选择一个元素来创建的这些列表的所有可能组合。我不认为我描述得很好,但我正在寻找的是:

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

输出: ['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 会有一些功能来完成这个,但我找不到任何东西。除此之外,我在这里进行了一些谷歌搜索和搜索,但我无法找到能够更快或更简单地完成我正在寻找的东西的东西。

有没有更好的方法来实现这一点,或者可能有一个库已经完成了这个功能?

【问题讨论】:

  • 为什么是'ab'?它使用第一个列表中的两个索引和第二个列表中的零索引。
  • 它从每个索引的任一列表中选择一个元素,而不是每个列表。所以对于每一个输出,output[0]可以是input_1[0]或者input2[0],而output[1]可以是input_1[1]或者input_2[1]。这样有意义吗?
  • 是的,现在说得通了

标签: python list iteration generator


【解决方案1】:

你必须转换

['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']

【讨论】:

    【解决方案2】:

    你可以zip()这两个列表一起得到对应索引处的值对的列表,然后使用product()得到在每个索引处选择一个元素的所有组合:

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

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

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多