如何在Python3上三取二列表

2024-10-05 01:56:35 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是:将3个相同长度的列表转换为2个列表,其长度相差不超过1,来自不同源列表的元素必须交替,并且不能违反它们的顺序。例如:如果源列表中的“A”在“B”之前,那么在最终列表中,“B”不能在“A”之前。 所以,我决定写一个函数:

def list_3_2(list1,list2,list3):
    #split all lists in one list
    a=sum((list(i) for i in zip(list1,list2,list3)),[])
    #I want to separate list "a" to two new lists: l1 and l2 
    l1=[]
    l2=[]
    #//////
    return(l1,l2)

list_3_2(['1','2','3'],['4','5','6'],['7','8','9'])

然后我面临着分离的问题。我发现了一些类似的问题,但它们的列表结构不同,比如main_list=['3 5', '1 2', '1 7']。在统一之后,我得到另一个结果:a=['1', '4', '7', '2', '5', '8', '3', '6', '9']。我怎样才能把这张单子分开


Tags: to函数in元素l1目标列表顺序
3条回答

也许我误解了这个问题

from itertools import chain


def list_3_2(l1, l2, l3):
    x = list(chain.from_iterable(zip(l1, l2, l3)))
    m = len(x) // 2
    return (x[:m], x[m:])

压缩列表,将结果元组连接到单个列表中,然后将其拆分为两半

嗯,根据您共享的最终确定信息,我相信您非常接近解决方案,您只需要拆分最终阵列。你觉得这个怎么样

def list_3_2(list1,list2,list3):
    a=sum((list(i) for i in zip(list1,list2,list3)),[])
    return a[:len(a)//2], a[len(a)//2:]
    
print(list_3_2(['1','2','3'],['4','5','6'],['7','8','9']))

基本上,将列表拆分为两部分,其中一部分最多比另一部分大1个元素,对应于在向下舍入的中点的索引处拆分任意列表。如果原始数组(输入链)的长度为奇数,则这些部分的长度将不同

数组的中点索引是len(array)//2-len(array)是全长,//2 是“半舍入除法”的运算

最后,为了使用这个中点索引分割数组,我们使用python中的splicing机制。语法如下:

a[:m]=从索引0(=开始)到索引m-1a的所有元素

a[m:]=从索引m到索引len(a) - 1(=结尾)的a的所有元素

嘿,试试看,希望是你想要的吗

def list_3_2(list1,list2,list3):
        #split all lists in one list
        #I want to separate list "a" to two new lists: l1 and l2 
        a=[]
        [a.extend(j) for j in (list(list(i) for i in zip(list1,list2,list3)))]
        #//////
        div=int(len(a)/2)
        l1=a[0:div]
        l2=a[div:]
        return  l1,l2
    
print(list_3_2(['1','2','3'],['4','5','6'],['7','8','9']))

相关问题 更多 >

    热门问题