将一个列表的元素映射到另一个

时间:2018-08-07 17:16:31

标签: python list

我有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]]

欢迎提出任何建议。

7 个答案:

答案 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)

问题很明显:您已经不能ListAListB使用相同的索引,就像您已经指出的那样。别那样做。为每个列表保留一个单独的索引:

代码:

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

有两种可能的解决方案:

  1. 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
    
  2. 如果您不再使用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