如何相应地删除二维数组和一维数组中的元素



我正在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_。有益于学习。对于最常见的情况,您需要采取不同的方法,正如本线程中回答的那样。

相关内容

  • 没有找到相关文章

最新更新