我有2个列表:
ListA = [['Download', '1', '12AUG18 123409'],
['Transfer', '1', '13AUG18 114148'],
['Download', '1', '13AUG18 131727']]
etc..
ListB = [4.24, 7.33]
在嵌套的ListA
中,如果ListB
中的第一个元素,我想附加ListA == 'Download'
的值
我正在尝试使其顺序排列,以便ListA
中的第一个“下载”列表将附加在ListB
中的第一个元素,依此类推。我知道必须有一种简单的方法它。
我尝试过:
for i in range(0, len(ListA)):
if ListA[i][0] == 'Download':
ListA[i].append(ListB[i])
这不起作用,因为如果for循环跳过其嵌套列表之一(如示例中所示),ListA
的索引(i)将与ListB
的索引不相关,因此i
将超出范围。
所以我希望我的最终结果是:
ListA = [['Download', '1', '12AUG18 123409', 4.24],
['Transfer', '1', '13AUG18 114148'],
['Download', '1', '13AUG18 131727', 7.33]]
欢迎提出任何建议。
答案 0 :(得分:1)
您实际上不需要关心索引:可以在ListB
上使用iter创建一个迭代器,并在需要时使用next
来获取其元素:
ListA = [['Download', '1', '12AUG18 123409'], ['Transfer', '1', '13AUG18 114148'], ['Download', '1', '13AUG18 131727']]
ListB = [4.24, 7.33]
iterB = iter(ListB)
for sublist in ListA:
if sublist[0] == 'Download':
sublist.append(next(iterB))
print(ListA)
# [['Download', '1', '12AUG18 123409', 4.24], ['Transfer', '1', '13AUG18 114148'], ['Download', '1', '13AUG18 131727', 7.33]]
答案 1 :(得分:0)
问题很明显:您已经不能对ListA
和ListB
使用相同的索引,就像您已经指出的那样。别那样做。为每个列表保留一个单独的索引:
代码:
b_idx = 0
for i in range(0, len(ListA)):
if ListA[i][0] == 'Download':
ListA[i].append(ListB[b_idx])
b_idx += 1
此外,为什么要从索引ListA
开始呢?您实际上并不需要:直接进入项目本身:
b_idx = 0
for item in ListA:
if item[0] == 'Download':
item.append(ListB[b_idx])
b_idx += 1
答案 2 :(得分:0)
In [1]: ListA = [['Download', '1', '12AUG18 123409'], ['Transfer', '1', '13AUG18 114148'], ['Download', '1', '13AUG18
...: 131727']]
In [2]: ListB = [4.24, 7.33]
In [3]: count = 0 # maintain index count
In [4]: for i in ListA: # iterate over elements in list
...: if i[0] == "Download":
...: i.append(ListB[count])
...: count += 1 # update index count if one is used
...:
In [5]: ListA
Out[5]:
[['Download', '1', '12AUG18 123409', 4.24],
['Transfer', '1', '13AUG18 114148'],
['Download', '1', '13AUG18 131727', 7.33]]
一个python内衬解决方案:
In [1]: ListA = [['Download', '1', '12AUG18 123409'], ['Transfer', '1', '13AUG18 114148'], ['Download', '1', '13AUG18
...: 131727']]
In [2]: ListB = [4.24, 7.33]
In [3]: list(map(lambda x: x + [ListB.pop(0)] if "Download" == x[0] else x, ListA))
Out[3]:
[['Download', '1', '12AUG18 123409', 4.24],
['Transfer', '1', '13AUG18 114148'],
['Download', '1', '13AUG18 131727', 7.33]]
答案 3 :(得分:0)
使用计数器跟踪您上次附加在ListB
中的位置:
i = 0
for a in ListA:
if a[0] == 'Download':
a.append(ListB[i])
i += 1
答案 4 :(得分:0)
这是一种使用itertools.count
作为索引变量来创建新列表的解决方案
>>> from itertools import count
>>> c=count()
>>> [l+[ListB[next(c)]] if l[0]=='Download' else l for l in ListA]
[['Download', '1', '12AUG18 123409', 4.24], ['Transfer', '1', '13AUG18 114148'], ['Download', '1', '13AUG18 131727', 7.33]]
答案 5 :(得分:0)
您已经注意到,附加ListB[i]
是不正确的,因为您要附加的项目的索引不同于i
。
有两种可能的解决方案:
为j
创建另一个索引变量,例如ListB
。每次您添加ListB
中的项目时,您都会将j
加1,因此下一次ListB
中的项目将是正确的:
j = 0
for i in range(0, len(ListA)):
if ListA[i][0] == 'Download':
ListA[i].append(ListB[j])
j += 1
如果您不再使用ListB
,则可以使用pop
方法,如下所示:
for i in range(0, len(ListA)):
if ListA[i][0] == 'Download':
ListA[i].append(ListB.pop(0))
方法ListB.pop(0)
返回,删除ListB
的第一项,正是您需要的第一项,如果您不再使用ListB
(因为它变空了。)
无论哪种方式,您都不需要变量i
,只需在列表中进行迭代即可:
for item in ListA:
# check condition and append
答案 6 :(得分:0)
必须谨慎处理ListB的索引,如果不控制它,它可能会超出范围,并且ListA的Download开头的子列表比listB的长度多。
控制很简单,下面的代码就足够了:
i = 0
for subList in ListA:
if i>=len(ListB):
break
elif(subList[0] == "Download"):
subList.append(ListB[i])
i+=1