2017-08-03 106 views
3

的值替换空值我有两个列表列表中的另一个列表

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

如何更换使用的lis1None值,而不会创建任何新的列表?

最终的结果应该是

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

到目前为止我试过

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

但是这给了我一个不正确的列表。

回答

2

这里是一个可能的办法:

In [870]: lis2[lis2.index(None):] = lis1 

In [871]: lis2 
Out[871]: [10, 34, 90, 108, 12, 34, 56, 89] 

子片分配。这里的假设是lis2具有尽可能多的None值,因为lis1具有元素并且它们都位于最后。


进行分解:

  1. lis2.index(None)返回列表中的None第一指数

    In [873]: lis2.index(None) 
    Out[873]: 4 
    
  2. 您可以获取的lis1这样子切片:

    In [874]: lis2[lis2.index(None):] 
    Out[874]: [None, None, None, None] 
    
  3. 只需重新分配lis2即可。

+0

@COLDSPEED你能解释我的第一行代码吗? –

+0

@SouvikRay编辑我的答案与解释。 –

+2

@coldspeed什么是'None'在lis2中洗牌? – voidpro

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] 

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

+1

这不会从'lis2'删除任何元素。它只是创建一个新列表并将其分配给'lis2'变量。 –

+0

@PaulRooney多数民众赞成正确。 'lis2'将被重新分配新的值。 – voidpro

+0

是的,如果内存空间不是问题,即使这可以被接受。 –

1

延长lis2(扩大在COLDSPEED的答案,这是清洁,如果所有的诺内斯都在列表的末尾。)

# 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的长度是一样的None S IN列表中的号码2.

+0

如果'lis2'中'None'的数量大于'lis1'中的元素数? – voidpro

+0

你会得到'列表索引超出范围'的错误。如果你想确保没有发生,只要'j == len(lis1)'''就可以'断开'循环。 –

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] 
相关问题