【问题标题】:Python zip function performs abnormally, Cannot append to list properlyPython zip 函数执行异常,无法正确附加到列表
【发布时间】:2020-09-05 05:47:02
【问题描述】:

我有以下代码。当它单独运行时,我会得到final_list as

[[1, 10, 20], [2, 11, 21], [3, 10, 22], [1, 10, 23]]

但是如果我在另一个循环中运行,我会得到

[[1, 10, 20, 23], [2, 11, 21], [3, 10, 22], [1, 10, 20, 23]]
   final_list= [[1, 10], [2, 11], [3, 10], [1, 10]]
   list_present= [20, 21, 22, 23]
   for val, val2 in zip(final_list, list_present):
       val.append(val2)

这是完整的程序:

x = [[1, 2, 3], [10, 11],[20, 21, 22, 23]]
y = ['a', 'b', 'c']
final = []
list_present = []
list_previous = []
for row in x:
    final_list = []
    len_final = len(final)
    if len_final == 0:
        for attr_val in row:
            final.append([attr_val])
    else:
        list_present = row
        len_array = len(list_previous) - len(list_present)
        if len_array > 0:
            list_present.extend(list_present[:abs(len_array)])
            final_list = list_present
            for val1, val2 in zip(final, final_list):
                val1.append(val2)
        else:
            list_previous.extend(list_previous[:abs(len_array)])
            final_list = list_previous
            for val1, val2 in zip(final_list, list_present):
                val1.append(val2)
    list_previous = final

【问题讨论】:

    标签: python python-3.x for-loop append zip


    【解决方案1】:

    不是zip的问题,是这一行的问题:

    list_previous.extend(list_previous[:abs(len_array)])
    

    您正在扩展list_previous 与出现在列表开头的完全相同的对象。这对于像 int 这样的不可变对象来说很好,但在这种情况下,list_previous 中的元素是列表。这意味着当您将元素附加到以下 for 循环中的第一个子列表时,您也将它们附加到最后一个子列表,因为这些引用完全相同的对象。为了避免这种情况,你可以做类似的事情

    list_previous.extend(lst[:] for lst in list_previous[:abs(len_array)])
    

    这将使用前几个子列表的副本而不是子列表本身来扩展 list_previous

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2019-11-30
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多