【问题标题】:How to make two lists out of three on Python3如何在 Python3 上制作三个列表中的两个列表
【发布时间】:2021-09-04 12:48:54
【问题描述】:

目标是:将 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']。我怎么能把这个列表分开?

【问题讨论】:

  • 通过 "来自不同源列表的元素必须交替" 你的意思是在结果列表中,对于任何一对连续的元素,它们来自不同的源列表是真的吗?含义是否也相反(也就是说,我的释义是否与您的相同?)另外,在所有原始列表的并集中,是否没有两个元素是相等的?
  • @CaptainTrojan 所以,回答你的第一个问题:是的,我的意思是在结果列表中,对于任何一对连续元素,它们确实来自不同的源列表。我不明白你的第二个问题。第三个问题:这不是真的。
  • 您的预期输出是什么样的?
  • @Ben 我想知道我的解释是否真的等同于你的提议(在我原来的评论中用斜体字),或者只要你的提议是真的,我的解释是真的,而不是相反.我怀疑它们是等价的。另外,如果您声称我的第三个问题的答案不正确,那么问题可能没有解决方案,对吗? (例如,如果原始数组中的所有元素都相等)。
  • @CaptainTrojan 对不起,我在回答你的第三个问题时犯了一个错误。你的第三个问题的答案是正确的。我同意你的释义和命题是等价的

标签: python python-3.x list function


【解决方案1】:

嘿,试试吧,希望就是你想要的

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

【讨论】:

  • 很遗憾,您的程序运行起来不太正确。请再检查一次,请
  • 但预期输出如下:(['1', '4', '7', '2'], ['5', '8', '3', ' 6', '9']) .你的输出:[['1', '4', '7'], ['2', '5', '8']]
  • 啊好的,我现在就修复它
【解决方案2】:

好吧,根据您分享的最终确定信息,我相信您非常接近解决方案,您只需要拆分最终数组即可。您对此有何看法?

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] = a 的所有元素,从索引 0(= 开头)到索引 m-1

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

【讨论】:

  • 这太棒了!谢谢!您能否在您的代码return a[:len(a)//2], a[len(a)//2:] 中评论这一行并提供更多详细信息,请
  • @Ben 我在答案正文中添加了其他信息:)
  • 感谢您的信息!真的很有用!
【解决方案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:])

压缩列表,将生成的元组连接成一个列表,然后将其分成两半。

【讨论】:

  • 这相当于我的解决方案,upvoting。
  • 运行代码后的结果如下:NameError: name 'chain' is not defined
  • 不太等价;使用sum 意味着您在创建最终结果的过程中创建了一堆临时的list 对象。 chain.from_iterable 只需创建一个可用于创建 single 列表的可迭代对象。 (类似于s = s1 + s2 + s3''.join([s1, s2, s3])的区别。
  • @Ben 我忘记了将chain 纳入范围的import 语句。
  • 当然,在我评论的上下文中,等价意味着“为输入产生相同的输出”。
猜你喜欢
  • 2022-08-19
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2017-04-13
相关资源
最近更新 更多