【问题标题】:Combine elements from two lists合并两个列表中的元素
【发布时间】:2019-02-22 16:07:15
【问题描述】:

我想以一种特殊的方式在 python 中合并两个数组。 我的输出数组out 具有奇数索引的条目将是我的第一个输入数组in0 的对应条目。 out 中具有偶数索引的条目将是我的第二个输入数组的对应条目 in1.

in0in1out 的长度都相同。

例子:

输入数组

in0 = [0, 1, 2, 3]
in1 = [4, 5, 6, 7]

应合并到输出数组

out = [0, 5, 2, 7]

有没有比循环输入的整个长度并填充我的out'手动'更好的方法?

【问题讨论】:

    标签: python arrays list


    【解决方案1】:

    您可以使用列表推导并从 in0 中选择偶数索引和 in1 奇数索引中的值:

    [in0[i] if i % 2 == 0 else in1[i] for i in range(len(in0))]
    # [0, 5, 2, 7]
    

    【讨论】:

    • 我没有得到完整的语法,但我会查一下。谢谢!
    • i % 2 == 0 正在检查 i/2 的剩余部分是否为 0 。如果是0,则索引是偶数,并且将添加来自in0 的元素,否则来自id1。 YW :-)
    • 同样的想法可以更简洁地写成[x[i%2] for i, x in enumerate(zip(in0, in1))]
    • 外括号和for i in range() 让我很困惑,因为我对python 不太熟悉。但我查了一下,列表理解是一个不错的 Python 功能,我不知道
    • 这也简化了我自己的答案。
    【解决方案2】:

    如果您愿意制作完整的列表副本,那么切片很简单:

    >>> in0 = [0, 1, 2, 3]
    >>> in1 = [4, 5, 6, 7]
    >>> out = in0[:]
    >>> out[1::2] = in1[1::2]
    >>> out
    [0, 5, 2, 7]
    

    【讨论】:

    • 非常好。不幸的是,我过于简化了我的示例:我的输入是字符串,out[ 1::2] = in1[1::2] 显然不适用于字符串。但这是我所希望的又好又干净的语法!
    • 非常优雅的解决方案。应该被接受为答案!
    【解决方案3】:

    如果你不介意一些冗长...

    from itertools import cycle
    
    in0 = [0, 1, 2, 3]
    in1 = [4, 5, 6, 7]
    
    out = [pair[i] for pair, i in zip(zip(in0, in1), cycle([0,1]))]
    

    它是如何工作的:

    1. zip(in0, in1) 是一个元组序列,(0,4), (1,5), (2,6), (3,7)

    2. cycle([0,1]) 是无穷无尽的交替 0 和 1 流,用作步骤 1 元组中的索引。

    3. zip(zip(...), cycle(...)) 产生一对元组和索引:

      (0, (0,4)), (1, (1,5)), (0, (2,6)), (1, (3,7)).
      
    4. 列表推导从每个元组中获取正确的元素。

    最后,列表推导是一个通用版本

    [(0,4)[0], (1,5)[1], (2,6)[0], (3,7)[1]]
    

    【讨论】:

      【解决方案4】:

      不使用循环,但与您要求的顺序不同:

      >> in0 = [0, 1, 2, 3]
      >> in1 = [4, 5, 6, 7]
      >> out = in0[0::2] + in1[1::2]
      >> out
      [0, 2, 5, 7]
      

      编辑:使用 itertools 更正输出顺序:

      >> import itertools
      >> in0 = [0, 1, 2, 3]
      >> in1 = [4, 5, 6, 7]
      >> out = list(itertools.chain(*zip(in0[0::2], in1[1::2])))
      >> out
      [0, 5, 2, 7]
      

      【讨论】:

      • 这看起来不错,但我想保留订单
      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2021-06-13
      • 1970-01-01
      • 2018-09-14
      相关资源
      最近更新 更多