我是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']