【问题标题】:how to combine two lists? [closed]如何组合两个列表? [关闭]
【发布时间】:2014-07-31 19:40:50
【问题描述】:

我有 2 个列表

mylist1 = [ 23,   13, None, 65,   None, 966, None, None]
mylist2 = [ None, 13, 98,   None, 61,   966, 13,   2]

我需要将这两个列表合并到

[ 23,   13, 98, 65,   61, 966, 13, 2]

有什么好的解决方案吗?

--

我选择的解决方案,谢谢@shaktimaan

mylist = [(a if a!=None else b) for a, b in zip(mylist1, mylist2)] 

【问题讨论】:

  • 如果两个列表不一致怎么办? [None, 2] 和 [1, 3]
  • 96 在您的输出中来自哪里?不应该是98吗?
  • 到目前为止你尝试过什么?
  • 您如何决定结果列表中的内容?例如,@delnan 的结果是什么
  • 您似乎希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只会在发布者已经尝试自己解决问题时提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。

标签: python list merge


【解决方案1】:

我尝试过精心制作:

mylist1 = [ 23,   13, None, 65,   None, 966, None, None]
mylist2 = [ None, 13, 98,   None, 61,   966, 13,   2]
newList = []

if len(mylist1)>len(mylist2):
    length = len(mylist1)
else:
    length = len(mylist2)

for i in range(length):
    if mylist1[i] and i<len(mylist1):
        newList.append(mylist1[i])
    if mylist2[i] and i<len(mylist2) and mylist2[i] != mylist1[i]:
        newList.append(mylist2[i])

print newList

打印出来了:

[23, 13, 98, 65, 61, 966, 13, 2]

【讨论】:

    【解决方案2】:

    你应该看看内置的map 函数。 map 将函数应用于一个或多个列表的每个元素。例如:

    >>> def addOne(x):
    ...     return x+1
    ... 
    >>> map(addOne, [1, 2, 3, 4])
    [2, 3, 4, 5]
    

    有两个列表和一个 lambda 函数:

    >>> map(lambda x,y: x+y, [1, 2, 3, 4], [2, 3, 4, 5])
    [3, 5, 7, 9]
    

    所以你只需要这样做:

    combined_list = map(combine_function, mylist1, mylist2)
    

    【讨论】:

    • 仅供参考 map(f, zip(a, b)) 可以更容易地写成 map(f, a, b)。它不是完全等价的(它传递两个参数而不是单个元组),但在大多数情况下这是一种改进。
    • 是的...刚刚记得。
    • 谢谢,地图功能好像很有用。
    【解决方案3】:

    你可以这样做:

    for i, n in enumerate(mylist1): mylist2[i]=mylist2[i] or n
    

    如果两个列表对于同一位置都有一个值(不同的值),则将选择 mylist2 中的值。

    您可以交换列表以优先选择mylist1,或者您可以使用max、min 或其他一些函数在不同的值之间进行选择:

    for i, n in enumerate(mylist1): mylist2[i]=max(mylist2[i], n)
    

    如果两者在给定位置都有None,它将保留在结果列表中。

    【讨论】:

      【解决方案4】:

      假设它是两个列表中对应数字的 ORing,这是获得输出列表的一种方法:

      >>> mylist1 = [ 23,   13, None, 65,   None, 966, None, None]
      >>> mylist2 = [ None, 13, 98,   None, 61,   966, 13,   2]
      >>> mylis1 = [a if a else 0 for a in mylist1 ]
      >>> mylis1
      [23, 13, 0, 65, 0, 966, 0, 0]
      >>> mylis2 = [a if a else 0 for a in mylist2 ]
      >>> mylis2
      [0, 13, 98, 0, 61, 966, 13, 2]
      >>> output = [a | b for a, b in zip(mylis1, mylis2)]
      >>> output
      [23, 13, 98, 65, 61, 966, 13, 2]
      

      【讨论】:

      • 谢谢,这很好,这就是我想要的。 mylist = [(a if a!=None else b) for a, b in zip(mylist1, mylist2)]
      猜你喜欢
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多