Python 列表串联逻辑

Python list concatenation logic

我试图连接两个列表,它们是 'Names' 和 'Ages'。 但是我想通过每次将 [i+1] 的索引附加到另一个列表来做到这一点。 因此,我的目标不是 ['John'、'17'、'Mike'、'21'],而是每个对都有不同的索引,并且是一个列表 element.Like --> [ ['John', '17'], ['Mike', '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'], ['July', '76']]

正如你所看到的,我设法做到了,但奇怪的是 b.append([] + a) 行。当我输入 b.append(a) 它 returns 空 b 列表时,我意外地得到了我想要的东西。 但是按照附加代码中的路径,我正在完成我想要做的事情。谁能解释为什么这是有效的?我抓不到。

提前致谢。

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

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

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

在代码中添加打印显示 b 在循环后得到 'cleared',并且它没有在循环内存储正确的信息。它本质上是相同 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']]

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

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)
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) 每次都与 array.if 连接,你用这样的打印语句检查

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 = [] 当我们尝试 b.append([]+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']]

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

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

b = [[name,age] for name, age in zip(names,ages)]

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

result = list(zip(names, ages))