【问题标题】:append list of values to sublists将值列表附加到子列表
【发布时间】:2014-02-14 21:24:55
【问题描述】:

如何将一个列表的每个项目附加到另一个列表的每个子列表?

a = [['a','b','c'],['d','e','f'],['g','h','i']]
b = [1,2,3]

结果应该是:

[['a','b','c',1],['d','e','f',2],['g','h','i',3]]

请记住,我想对一个非常大的列表执行此操作,因此效率和速度很重要。

我试过了:

for sublist,value in a,b:
    sublist.append(value)

它返回 'ValueError: too many values to unpack'

也许 listindex 或 listiterator 可以工作,但不确定如何在这里应用

【问题讨论】:

    标签: python list iterator iteration sublist


    【解决方案1】:
    a = [['a','b','c'],['d','e','f'],['g','h','i']]            
    b = [1,2,3]
    
    for ele_a, ele_b in zip(a, b):
        ele_a.append(ele_b)
    

    结果:

    >>> a
    [['a', 'b', 'c', 1], ['d', 'e', 'f', 2], ['g', 'h', 'i', 3]]
    

    您原来的解决方案不起作用的原因是 a,b 确实创建了一个 tuple,但不是您想要的。

    >>> z = a,b
    >>> type(z)
    <type 'tuple'>
    >>> z
    ([['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']], [1, 2, 3])
    >>> len(z[0])
    3
    >>> for ele in z:
    ...    print ele
    ... 
    [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']] #In your original code, you are
    [1, 2, 3]                                           #unpacking a list of 3 elements 
                                                        #into two values, hence the 
                                                        #'ValueError: too many values to unpack'
    
    >>> zip(a,b)  # using zip gives you what you want.
    [(['a', 'b', 'c'], 1), (['d', 'e', 'f'], 2), (['g', 'h', 'i'], 3)]
    

    【讨论】:

      【解决方案2】:

      这是一个简单的解决方案:

      a = [['a','b','c'],['d','e','f'],['g','h','i']]
      b = [1,2,3]
      
      for i in range(len(a)):
              a[i].append(b[i])
      print(a)
      

      【讨论】:

        【解决方案3】:

        一个选项,使用列表推导:

        a = [(a[i] + b[i]) for i in range(len(a))]
        

        【讨论】:

        • 这会将a 替换为包含新列表的新列表。在这种情况下,最终结果将是相同的,但创建一堆新列表会有些低效。
        【解决方案4】:

        只需遍历子列表,一次添加一项:

            for i in range(0,len(listA)):
                 listA.append(listB[i])
        

        【讨论】:

        • 这里不要使用range,而是考虑使用enumerate(listA)for i, el_a in enumerate(a): el_a.append(b[i])我想是你的意思。
        【解决方案5】:

        你可以这样做:

        >>> a = [['a','b','c'],['d','e','f'],['g','h','i']]
        >>> b = [1,2,3]
        >>> [l1+[l2] for l1, l2 in zip(a,b)]
        [['a', 'b', 'c', 1], ['d', 'e', 'f', 2], ['g', 'h', 'i', 3]]
        

        您还可以滥用列表推导的副作用来完成此操作:

        >>> [l1.append(l2) for l1, l2 in zip(a,b)]
        [None, None, None]
        >>> a
        [['a', 'b', 'c', 1], ['d', 'e', 'f', 2], ['g', 'h', 'i', 3]]
        

        【讨论】:

          猜你喜欢
          • 2012-12-20
          • 2019-03-29
          • 1970-01-01
          • 2013-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多