我正在python中制作一个Gui应用程序,我在其中使用了一个简单的片段。我不明白为什么会发生这种事。代码:
k = ["Saikat","Ananya"]
names = ["Saikat","Ananya","Sam"]
for i in range (0,len(k)):
if k[i] in names:
names.pop(i)
print(names)
最后,名称数组由"组成;Ananya";而不是它应该有的";Sam";。我搞不清楚这里出了什么问题。
谢谢大家的回答,但这是我面临的真正问题。我试图尽量减少代码,但这些解决方案并没有解决我目前面临的问题。
app_list = [["saikat","male"],["ananya","female"],["sam","male"],["joe","male"]]
k= ["Sam","joe"]
for i in (app_list):
print(i[0])
if i[0] in k:
app_list.remove(i)
现在它确实删除了";sam";但它没有删除";乔";。
当您从names
弹出Saikat
时,它变成["Ananya","Sam"]
,因此当您的i
变成1
时,它从names
弹出names[1]
,即Sam
,并留给您["Ananya"]
一个解决方案是,
for name in k:
if name in names:
names.remove(name)
这在多维数组中是一件棘手的事情。当试图从列表中删除元素时,当它重复时会弄乱索引。你可以读这个来理解怎么做。处理二维数组时会变得更加棘手。然而,我用两个步骤解决了这个问题。首先从你的主要问题
app_list = [["saikat","male"],["ananya","female"],["sam","male"],
["joe","male"]]
k= ["Sam","joe"]
for i in (app_list):
print(i[0])
if i[0] in k:
app_list.remove(i)
您正在循环一个二维数组,并用一维数组进行检查,这将再次导致索引出现问题。你需要做的是从你要比较的列表中取出主要元素。在这种情况下,应用程序列表中的名称(如Saikat、Ananya等(,并将它们变成一个单独的列表。
x = []
for i in app_list:
print(i[0])
x.append(i[0])
print(x)
一旦你有了带有主要元素的X列表,以便与计数器部分进行比较你用来比较的K需要看到如果不是元素在K中。最好在这里使用列表理解来保持简洁。
print([Elements for Elements in x if Elements not in k ])
元素这里是存储和显示不在K中的值列表的变量。否则,我不认为你可以通过另一个列表从2d数组中删除一个列表,除非你单独这样做。
List的pop
函数通过该列表中给定的索引删除项目。您希望从列表中删除特定值,因此需要执行以下操作:
names.remove(k[i])
如前所述,您当前要做的是通过给定索引从names
列表中删除一个值。因此,您迭代k
,在索引0处找到名称Saikat
,然后它们弹出names
数组中索引0中的项,然后在k上的索引1处找到Ananya
,但现在,在从名称中删除以前的名称后,它的索引现在位于names
中的0上,这导致了无效的删除。因此,您应该反向迭代这些列表,或者按照建议按值移除。
而不是
names.pop(i)
使用
names.pop(names.index(k[i]))
如果您的目标只是从名称列表中删除k个列表元素,那么另一种解决方案是使用set:两个集合之间的差异对应于删除相交的元素。
result = set(k) - set(names)
print(result)
>>> Sam
NBset
结构的一个特性是它没有重复。例如:
mylist = ["ada","luke","ada"]
print(set(mylist))
>>> ada luke
- 与其他列表循环方法相比,Set操作速度更快(更多信息请点击此处(
- 阅读文档
我建议您调试代码打印的每一步,这有助于您自己学习,例如:
k = ["Saikat","Ananya"]
names = ["Saikat","Ananya","Sam"]
for i in range (0,len(k)):
print('names: ', names)
print('i:', i)
if k[i] in names:
print('k[i]: ', k[i])
print('names.pop(i): ', names.pop(i))
print('-'*30)
print('names: ', names)
print('-'*50)
结果是:
# names: ['Saikat', 'Ananya', 'Sam']
# i: 0
# k[i]: Saikat
# names.pop(i): Saikat
# ------------------------------
# names: ['Ananya', 'Sam']
# i: 1
# k[i]: Ananya
# names.pop(i): Sam
# ------------------------------
# names: ['Ananya']
# --------------------------------------------------
正如你所看到的,这个列表有点"旋转/移位";而你射错了元素。
一个修复方法是例如如何从列表中删除第一个项目?,因此使用names.pop(0)
:
k = ["Saikat","Ananya"]
names = ["Saikat","Ananya","Sam"]
for i in range (0,len(k)):
print('names: ', names)
print('i:', i)
if k[i] in names:
print('k[i]: ', k[i])
print('names.pop(0): ', names.pop(0))
print('-'*30)
print('names: ', names)
print('-'*50)
结果是:
# names: ['Saikat', 'Ananya', 'Sam']
# i: 0
# k[i]: Saikat
# names.pop(0): Saikat
# ------------------------------
# names: ['Ananya', 'Sam']
# i: 1
# k[i]: Ananya
# names.pop(0): Ananya
# ------------------------------
# names: ['Sam']
# --------------------------------------------------
重要提示
它之所以有效,是因为这是一个非常特殊的情况,其中CCD_。有益于学习。对于最常见的情况,您需要采取不同的方法,正如本线程中回答的那样。