如何相应地用一维数组删除二维数组中的元素
Posted
技术标签:
【中文标题】如何相应地用一维数组删除二维数组中的元素【英文标题】:How to delete elements in 2-dimensional array with 1-dimensional array accordingly 【发布时间】:2021-03-30 23:02:25 【问题描述】:我正在用 python 制作一个 Gui 应用程序,我使用的是一个简单的 sn-p。我不明白为什么会这样。 代码:
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”,但没有删除“joe”。
【问题讨论】:
首先可以看到'Sam' == 'sam'
是False
。在循环时第二次打印app_list
(请参阅我的答案),您可以发现列表在循环时被修改。最快的解决方法是遍历列表的副本:for i in app_list.copy():
【参考方案1】:
当你从names
弹出Saikat
时,它变成["Ananya","Sam"]
,所以当你的i
变成1
时,它从names
弹出names[1]
,它是Sam
并留给你["Ananya"]
解决办法是,
for name in k:
if name in names:
names.remove(name)
【讨论】:
【参考方案2】:这在多维数组中是一件棘手的事情。 在重复列表时尝试从列表中删除元素会弄乱索引。你可以阅读这个To understand how. 处理二维数组时会变得更棘手。但是,我设法通过两个步骤解决了这个问题。 首先是你的主要问题
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 需要查看 IF NOT 元素在 K 中。最好在此处使用 List comprehension 以保持简洁。
print([Elements for Elements in x if Elements not in k ])
Elements 这里是存储和显示不在 K 中的值列表的变量。否则,除非您单独执行,否则我认为您不能通过另一个列表从二维数组中删除列表。
【讨论】:
【参考方案3】:List 的pop
函数通过该列表中的给定索引删除项目。
您希望从列表中删除特定值,因此您需要这样做:
names.remove(k[i])
如前所述,您当前所做的是,通过给定索引从names
列表中删除一个值。所以你迭代k
,在索引0处找到名称Saikat
,然后它们在names
数组中弹出索引0中的项目,然后你在k上的索引1处找到Ananya
,但是现在,在删除之后名称中的前一个名称,它的索引现在位于 names
中的 0 上,这会导致无效删除。因此,您应该反向迭代这些列表,或者按照建议按值删除。
【讨论】:
【参考方案4】:代替
names.pop(i)
使用
names.pop(names.index(k[i]))
【讨论】:
【参考方案5】:如果您的目标只是从名称列表中删除 k 个列表元素,另一种解决方案是使用集合:两个集合之间的差异对应于删除相交的元素。
result = set(k) - set(names)
print(result)
>>> Sam
NB set
结构的一个属性是它没有重复项。例如:
mylist = ["ada","luke","ada"]
print(set(mylist))
>>> ada luke
与其他列表循环方法相比,Set 操作速度更快(有关此here 的更多信息)
Read the docs
【讨论】:
【参考方案6】:我建议您调试打印出每个步骤的代码,这有助于您自己学习,例如:
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']
# --------------------------------------------------
如您所见,列表有点“旋转/移动”,您在拍摄错误的元素。
一个解决方法是例如How to remove the first Item from a list?,因此请改用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']
# --------------------------------------------------
重要提示
之所以有效,是因为这是k == names[:-1]
的一个非常特殊的情况。很适合学习。
对于最一般的情况,您需要采取不同的方法,正如此线程中的许多回答。
【讨论】:
以上是关于如何相应地用一维数组删除二维数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章