【问题标题】:Python list concatenation logicPython 列表连接逻辑
【发布时间】:2020-12-09 13:13:09
【问题描述】:

我试图连接两个列表,即“姓名”和“年龄”。 但我想通过每次将他们的 [i+1] 索引附加到另一个列表来做到这一点。 所以不是 ['John', '17', 'Mike', '21'],我的目标是每一对都有不同的索引,并且是一个列表元素。就像那样 --> [['John', ' 17'], ['迈克', '21']]

(注意:我知道我可以用 zip() 函数做到这一点,这是为了练习)

所以我最终得到了那个代码 -->

names = ['Ana', 'John', 'Bob', 'Mike', 'July']
ages = ['17', '22', '33', '8', '76']
a = []
b = []
for i in range(len(names)):
    a.append(names[i])
    a.append(ages[i])
    b.append([] + a)
    a.clear()
print(b)

输出 --> [['Ana', '17'], ['John', '22'], ['Bob', '33'], ['Mike', '8'], ['七月','76']]

如你所见,我设法做到了,但奇怪的是 b.append([] + a) 行。我意外地得到了我想要的东西,当我输入 b.append(a) 时,它返回空的 b 列表。 但是通过遵循附加代码中的路径,我正在完成我想要做的事情。任何人都可以解释为什么这有效吗?我没听懂。

提前致谢。

【问题讨论】:

    标签: python list for-loop logic concatenation


    【解决方案1】:

    在代码中添加打印表明 b 在循环后被“清除”,并且它没有在循环内存储正确的信息。它本质上是相同的a 的副本:

    names = ['Ana', 'John', 'Bob', 'Mike', 'July']
    ages = ['17', '22', '33', '8', '76']
    a = []
    b = []
    for i in range(len(names)):
        a.append(names[i])
        a.append(ages[i])
        print(a)
        b.append(a)
        print(b)
        a.clear()
    print(b)
    
    ['Ana', '17']
    [['Ana', '17']]
    ['John', '22']
    [['John', '22'], ['John', '22']]
    ['Bob', '33']
    [['Bob', '33'], ['Bob', '33'], ['Bob', '33']]
    ['Mike', '8']
    [['Mike', '8'], ['Mike', '8'], ['Mike', '8'], ['Mike', '8']]
    ['July', '76']
    [['July', '76'], ['July', '76'], ['July', '76'], ['July', '76'], ['July', '76']]
    [[], [], [], [], []]
    

    这是因为列表在 python 中是可变的。当您清除它时, b 指向的数据也会被删除。当您执行[]+a 时,您正在创建一个不再引用a 的新列表。通过这种方式更改代码,您可以获得所需的内容:

    names = ['Ana', 'John', 'Bob', 'Mike', 'July']
    ages = ['17', '22', '33', '8', '76']
    b = []
    for i in range(len(names)):
        a = []
        a.append(names[i])
        a.append(ages[i])
        b.append(a)
    print(b)
    

    为了帮助您理解我所说的可变,请参阅以下示例:

    a = ['some data']
    b = [a]
    print(b)
    a.clear()
    print(b)
    
    [['some data']]
    [[]]
    

    这就是a+[] 起作用的原因:

    a = ['some data']
    b = [a+[]]
    print(b)
    a.clear()
    print(b)
    
    [['some data']]
    [['some data']]
    

    【讨论】:

    • 无法更好地解释,谢谢
    【解决方案2】:

    如果两个列表的元素数量相同,则可以使用 zip() 函数。

    注意:zip() 函数只会迭代直到最小的列表通过。

    list1=[]
    for x,y in zip(names,ages):
        list1.append([x,y])
    print(list1)
    

    【讨论】:

      【解决方案3】:

      以下是我使用列表理解的解决方案。

      names = ['Ana', 'John', 'Bob', 'Mike', 'July']
      ages = ['17', '22', '33', '8', '76']
      
      new_list = [ [names[i], ages[i]] for i in range(len(names))]
          
      print(new_list)
      

      【讨论】:

      • 不错的方法
      【解决方案4】:
      names = ['Ana', 'John', 'Bob', 'Mike', 'July']
      ages = ['17', '22', '33', '8', '76']
      a = []
      b = []
      for i in range(len(names)):
          a.append(names[i])
          a.append(ages[i])
          b.append([]+a)
          a.clear()
          
      print(b)
      

      根据你的代码b.append([]+a) 每次都与数组连接。如果您使用这样的打印语句进行检查

      for i in range(len(names)):
          a.append(names[i])
          a.append(ages[i])
          print("=>",a)
      

      然后显示你的输出是

      => ['Ana', '17']
      => ['John', '22']
      => ['Bob', '33']
      => ['Mike', '8']
      => ['July', '76']
      

      这样当你添加b.append([]+a) 我们现在更清楚地了解 乙 = [] 当我们尝试 b.追加([]+a) 这意味着上面的数组将许多数组连接成一个数组。

      我认为您在使用时很容易解决您的问题 zip() 用于迭代。

      myList=[]
      for a,b in zip(names,ages):
          list.append([a,b])
      
      
      print(myList)
      

      输出:

      [['Ana', '17'], ['John', '22'], ['Bob', '33'], ['Mike', '8'], ['July', '76']]
      

      【讨论】:

        【解决方案5】:

        我会在列表理解中使用 zip:

        names = ['Ana', 'John', 'Bob', 'Mike', 'July']
        ages = ['17', '22', '33', '8', '76']
        
        b = [[name,age] for name, age in zip(names,ages)]
        

        【讨论】:

          【解决方案6】:

          您可以使用ziplist 在一行代码中编写:

          result = list(zip(names, ages))
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-11
            • 2010-12-23
            • 2018-06-03
            • 2011-09-28
            • 2017-11-06
            • 1970-01-01
            • 2021-08-11
            • 1970-01-01
            相关资源
            最近更新 更多