我有两个列表
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]
但这给了我一个不正确的清单。
答案 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
个值,并且它们都位于最后。
要打破它:
lis1
返回列表中lis2.index(None)
的第一个索引
None
您可以像这样获得In [873]: lis2.index(None)
Out[873]: 4
的子组:
lis1
只需将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]