使用另一个列表的值替换列表中的空值

时间:2017-08-03 04:16:36

标签: python python-3.x list-comprehension

我有两个列表

lis1 = [12,34,56,89]
lis2 = [10,34,90,108,None,None,None,None]

如何在不创建任何新列表的情况下将None值替换为lis1值?

最终结果应为

lis2 = [10,34,90,108,12,34,56,89]

到目前为止,我试过了

lis2 = [i for j in lis2 for i in lis1 if j is None]

但这给了我一个不正确的清单。

4 个答案:

答案 0 :(得分:2)

这是一种可行的方法:

    var dateString = '2017-08-03'
    var dateFrom = new Date(dateString);
    console.log(dateFrom); //Thu Aug 03 2017 02:00:00 GMT+0200 (CEST)
    var dateTo = new Date(dateString);
    dateTo = new Date(dateTo.setMonth(dateTo.getMonth()+1));

    console.log(dateTo); //Sun Sep 03 2017 02:00:00 GMT+0200 (CEST) (one month later)

    console.log(dateFrom); //Sun Sep 03 2017 02:00:00 GMT+0200 (CEST)// (two dates turn into the same)
    var difference = Math.floor((dateTo - dateFrom) / 86400000); // 0

子包分配。这里的假设是,In [870]: lis2[lis2.index(None):] = lis1 In [871]: lis2 Out[871]: [10, 34, 90, 108, 12, 34, 56, 89] 具有与lis2一样多的None个值,并且它们都位于最后。

要打破它:

  1. lis1返回列表中lis2.index(None)的第一个索引

    None
  2. 您可以像这样获得In [873]: lis2.index(None) Out[873]: 4 的子组:

    lis1
  3. 只需将In [874]: lis2[lis2.index(None):] Out[874]: [None, None, None, None] 重新分配给此片段。

答案 1 :(得分:1)

这是一种方式。

> lis1 = [12,34,56,89]
> lis2 = [10,34,90,108,None,None,None,None]
> lis2 = [x for x in lis2 if x is not None]
> lis2
=> [10, 34, 90, 108]
> lis2 += lis1
> lis2
=> [10, 34, 90, 108, 12, 34, 56, 89]

首先从None删除所有lis2。然后使用lis2

扩展lis1

答案 2 :(得分:1)

(扩展COLDSPEED的答案,如果所有Nones都在列表的末尾,那就更清晰了。)

# Replace Nones in list 2 with elements from list 1
> lis1 = [2, 3, 6, 8]
> lis2 = [1, None, None, 4, 5, None, 7, None]

# Index of next element to use from list 1
> j = 0

> for i in range(len(lis2)):
    if lis2[i] == None:
        lis2[i] = lis1[j]  # Replace a None with something from list 1
        j += 1  # Use the following element next time

> lis2
[1, 2, 3, 4, 5, 6, 7, 8]

同样,如果无法保证列表1的长度与列表2中None的数量相同,则必须进行一些检查。

答案 3 :(得分:1)

更短的方式:

lis2 = [1, None, None, 4, 5, None, 7, None]
lis1 = [2, 3, 6, 8]
list2 =[i if i else lis1.pop(0) for i in lis2]
print(list2)

输出:

[1, 2, 3, 4, 5, 6, 7, 8]