【问题标题】: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():

标签: python python-3.x list


【解决方案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] 的一个非常特殊的情况。很适合学习。 对于最一般的情况,您需要采取不同的方法,正如此线程中的许多回答。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-05-26
              • 1970-01-01
              • 2023-02-25
              • 1970-01-01
              • 2013-05-16
              • 1970-01-01
              相关资源
              最近更新 更多