当尝试使用2个不同大小的列表时,我得到“索引列表超出范围”错误。
示例:
ListA = [None, None, None, None, None]
ListB = ['A', None, 'B']
for x, y in enumerate(ListA):
if ListB[x]:
ListA[x]=ListB[x]
执行此操作将导致“索引列表超出范围”错误,因为ListB [3]和ListB [4]不存在:
我希望加入ListA和ListB以使ListA看起来像这样:
ListA = ['A', None, 'B', None, None]
我怎样才能做到这一点?
答案 0 :(得分:8)
from itertools import izip_longest
ListA = [b or a for a, b in izip_longest(ListA,ListB)]
答案 1 :(得分:2)
试试这个:
>>> [i[1] for i in map(None,ListA,ListB)]
['A', None, 'B', None, None]
答案 2 :(得分:2)
最快的解决方案是使用切片分配
>>> ListA = [None, None, None, None, None]
>>> ListB = ['A', None, 'B']
>>> ListA[:len(ListB)] = ListB
>>> ListA
['A', None, 'B', None, None]
<强>时序强>
>>> def merge_AO(ListA, ListB):
return [ i[1] for i in map(None,ListA,ListB)]
>>> def merge_ke(ListA, ListB):
for x in range(len(ListB)): #till end of b
ListA[x]=ListB[x]
return ListA
>>> def merge_JK(ListA, ListB):
ListA = [b or a for a, b in izip_longest(ListA,ListB)]
return ListA
>>> def merge_AB(ListA, ListB):
ListA[:len(ListB)] = ListB
return ListA
>>> funcs = ["merge_{}".format(e) for e in ["AO","ke","JK","AB"]]
>>> _setup = "from __main__ import izip_longest, ListA, ListB, {}"
>>> tit = [(timeit.Timer(stmt=f + "(ListA, ListB)", setup = _setup.format(f)), f) for f in funcs]
>>> for t, foo in tit:
"{} took {} secs".format(t.timeit(100000), foo)
'0.259869612113 took merge_AO secs'
'0.115819095634 took merge_ke secs'
'0.204675467452 took merge_JK secs'
'0.0318886645255 took merge_AB secs'
答案 3 :(得分:1)
试试这个:
ListA = [None, None, None, None, None]
ListB = ['A', None, 'B']
for x in range(len(ListB)): #till end of b
ListA[x]=ListB[x]
答案 4 :(得分:1)
使用MAP避免列表索引超出范围错误
for iterator,tup in enumerate(map(None,ListA,ListB)):
if tup[1]:
ListA[iterator] = tup[1]
这将解决问题。