将字符串列表按元素与特殊规则组合在一起



我是python的新手,我正在尝试修改现有的程序。我有几个列表,我需要以排序的方式对它们执行操作。例如,如果我有以下列表:

list_A = ['A1', 'A2', 'A3']
list_B = ['B1', 'B2', 'B3', 'B4', 'B5']

我想得到一个带有elements = ['A1B1', 'A2B2', 'A3B3', 'B4B5']的新列表(即组合交替元素,直到较小的数组用完,然后合并大数组中的剩余元素。

这是 2 个列表的示例,但我正在尝试为 N 个列表执行此操作。

有没有一种"pythonic"的方式来实现这一目标?

编辑:为N>3案例添加更多信息(并使列表更大以更清楚地显示它们(。

list_A = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6']
list_B = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6']
list_C = ['C1', 'C2', 'C3', 'C4']

从"最小"列表开始,然后开始配对。目前,我正在处理一个案例,其中一个较短的列表,而其他列表的长度相同。所以下面的 A 或 B 都可以。

预期输出:['C1B1', 'C2B2', 'C3B3', 'C4B4', 'B5B6', 'A1A2', 'A3A4', 'A5A6']

您的问题没有指定当其中一个列表为空但其他两个列表剩余(可能不相等(数量的元素时,N> 3(或更高(情况会发生什么。

无论如何,我在实现这个递归解决方案时玩得很开心,所以就它的价值而言,它就在这里。

list_A = ['A1', 'A2', 'A3']
list_B = ['B1', 'B2', 'B3', 'B4', 'B5']
list_C = ['C1', 'C2']
def combine(*lists):
    lists = filter(None, lists)
    if not lists:
        return []
    if len(lists) == 1:
        return [''.join(lists[0])]
    minlen = len(min(lists, key=len))
    head = [''.join(x) for x in zip(*lists)]
    tail = [l[minlen:] for l in lists]
    return head + combine(*tail)
a = combine(list_A, list_B)
b = combine(list_A, list_B, list_C)
print a # ['A1B1', 'A2B2', 'A3B3', 'B4B5']
print b # ['A1B1C1', 'A2B2C2', 'A3B3', 'B4B5']

它的工作原理如下:只要不是所有列表都用尽,算法就会继续将剩余列表的元素压缩在一起。一旦只有一个列表剩下项目,这些项目就会连接成一个字符串并附加到结果中。对于 N> 2 情况,这可能是您想要的,也可能不是您想要的。

# Notice:  the lists are composed of integers...
>>> a_list = [1, 2, 3]
>>> b_list = [4, 5, 6]
>>> c_list = [7, 8, 9]
>>> def cat(a_list):
...     string = ''
...     for i in a_list:
...             string += str(i)  # so we convert them to string.
...     return string
... 
>>> # Using a list comprehension and an un-named variable, along with the
>>> # zip() function.
>>> [cat(_) for _ in zip(a_list, b_list, c_list)]
['147', '258', '369']

最新更新