【问题标题】:Iterating over a 2D List and removing elements or rows based on a conditional if statement - Python迭代二维列表并根据条件 if 语句删除元素或行 - Python
【发布时间】:2021-05-05 18:58:54
【问题描述】:

我有一个二维数组,第一列是一串名称,后面的列是它们的分数(整数)。我正在尝试遍历数组并删除任何大于 100 且小于 0 的分数(单个元素),或者从该数组中删除整行。我是他们试图将删除的分数写入 .txt 文件。

下面的第一个代码迭代一个数组,当我运行它以删除实际行时,它只删除了超过 100 的行,我必须重新运行它以删除元素超过 100 的更多行并且它不会删除元素小于 0 的任何行(因此是负数) int() 方法似乎没有在迭代比较时将负元素从 Str 转换为 Int? .

以下是我的分数数组;

    newArray = [['joe bloggs', '45', '46', '52', '83'],
 ['bobby uncle', '52', '45', '85', '63'],
 ['luke van', '69', '48', '45', '22'],
 ['lauren loo', '75', '24', '-65', '32'],
 ['heidi ho', '65', '7', '58', '14'],
 ['robyn cook', '23', '24', '51', '63'],
 ['cath roberts', '56', '85', '14', '74'],
 ['june jules', '58', '45', '26', '65'],
 ['dan nissie', '41', '56', '85', '45'],
 ['chris cooks', '24', '-15', '25', '75'],
 ['Kate Vander', '105', '23', '67', '1'],
 ['Luther rose', '55', '25', '207', '45']]






error = ""
for row in newArray:
    for index,col in enumerate(row):
        if col.isdigit() == True:
            if int(col)<0 or int(col)>100:
                error = error + col
                newArray.remove(row)

e.write(error)#I have a txt file set up for this. 

我也在尝试使用此代码仅删除单个元素。我读到删除一个元素会导致索引出现问题,可能不会删除元素,因此最好制作一个数组的副本,对其进行迭代,然后将其从原始数组中删除,但这会给我一个错误。

我试过了;

for row in copyOfArray:
    for col in row:
       if col.isdigit()== True:
           if int(col) < 0 or int(col) > 100:
              e.write(col)
              newArray.remove(col)

基本上结果应该是: #这个当我删除行时

newArray = [['joe bloggs', '45', '46', '52', '83'],
 ['bobby uncle', '52', '45', '85', '63'],
 ['luke van', '69', '48', '45', '22'],
 ['heidi ho', '65', '7', '58', '14'],
 ['robyn cook', '23', '24', '51', '63'],
 ['cath roberts', '56', '85', '14', '74'],
 ['june jules', '58', '45', '26', '65'],
 ['dan nissie', '41', '56', '85', '45']]

#this when I remove just the single element:
newArray = [['joe bloggs', '45', '46', '52', '83'],
 ['bobby uncle', '52', '45', '85', '63'],
 ['luke van', '69', '48', '45', '22'],
 ['lauren loo', '75', '24', '32'],
 ['heidi ho', '65', '7', '58', '14'],
 ['robyn cook', '23', '24', '51', '63'],
 ['cath roberts', '56', '85', '14', '74'],
 ['june jules', '58', '45', '26', '65'],
 ['dan nissie', '41', '56', '85', '45'],
 ['chris cooks', '24', '25', '75'],
 ['Kate Vander', '23', '67', '1'],
 ['Luther rose', '55', '25', '45']]

对于这个问题的规模,我深表歉意。

【问题讨论】:

    标签: python


    【解决方案1】:

    如果你想从列表中删除单个元素,你可以这样做:

    newArray = [['joe bloggs', '45', '46', '52', '83'],
     ['bobby uncle', '52', '45', '85', '63'],
     ['luke van', '69', '48', '45', '22'],
     ['lauren loo', '75', '24', '-65', '32'],
     ['heidi ho', '65', '7', '58', '14'],
     ['robyn cook', '23', '24', '51', '63'],
     ['cath roberts', '56', '85', '14', '74'],
     ['june jules', '58', '45', '26', '65'],
     ['dan nissie', '41', '56', '85', '45'],
     ['chris cooks', '24', '-15', '25', '75'],
     ['Kate Vander', '105', '23', '67', '1'],
     ['Luther rose', '55', '25', '207', '45']]
    
    new_array = []
    
    for row in newArray:
        numbers = [x for x in row if x.isdigit()]
        numbers_keep = [row[0]] + [n for n in numbers if int(n) >= 0 and int(n) <= 100]
        new_array.append(numbers_keep)
    

    返回:

    [['joe bloggs', '45', '46', '52', '83'],
     ['bobby uncle', '52', '45', '85', '63'],
     ['luke van', '69', '48', '45', '22'],
     ['lauren loo', '75', '24', '32'],
     ['heidi ho', '65', '7', '58', '14'],
     ['robyn cook', '23', '24', '51', '63'],
     ['cath roberts', '56', '85', '14', '74'],
     ['june jules', '58', '45', '26', '65'],
     ['dan nissie', '41', '56', '85', '45'],
     ['chris cooks', '24', '25', '75'],
     ['Kate Vander', '23', '67', '1'],
     ['Luther rose', '55', '25', '45']]
    

    如果要跟踪已删除的项目,可以在创建 numbers_keep 列表后使用以下行。我不确定您希望在将删除的项目写入文档之前如何对其进行格式化,所以我将把它留给您。

    diff = set(row) ^ set(numbers_keep)
    

    【讨论】:

    • 那太好了,Sandertjuhh,谢谢。所以我可以理解您的代码,您是否遍历原始“newArray”,然后使用 if 语句检查元素是否为整数并将其附加到名为“numbers”的新列表中。然后,您将遍历“数字”列表并将整数 >= 0 和
    • @EL.M 是的,就是这样 :)。
    猜你喜欢
    • 2011-11-29
    • 2017-07-03
    • 2016-07-13
    • 2018-10-12
    • 2020-06-12
    • 2019-01-16
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多