如果项目不是数字或大于特定值,如何从列表列表中删除列表?

2024-10-03 02:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要完成一个任务,其中涉及清理Python中的列表列表。如果子列表包含非数字或数字但大于20的项,我需要删除子列表并将其添加到单独的列表中

我当前的代码正确地删除了一些子列表,但没有删除其他子列表。我想这是因为两个连续的子列表有错误,但我还没能解决这个问题。我的代码:

datalist = [['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['6', '8', '16', '5', '0'], ['1', '30', '2', '5', '7'], ['14', '1', '2', '9', '3'], ['6', '9', '16', '0', ''], ['14', '11', 'forteen', '8', '20'], ['12', '11', '8', '15', '7'], ['18', '9', '9', '22', '4'], ['1', '3', '14', '18', '20'], ['5', '3', '19', '20', '0'], ['einundzwanzig', '14', '1', '2', '4']]

invalidList = []

def validate(myList): #non-numeric values or values greater than 20 must be removed from myList and added to invalidList
    for lst in myList: # check each list
            for item in lst: # check element in each list
                try:
                    val = int(item)
                    if val >20:
                        raise ValueError
                except ValueError:
                    invalidList.append(lst)
                    myList.remove(lst)

    return myList

有问题的子列表是:

['14', '11', 'forteen', '8', '20']

实际输出:

>>> print(validate(datalist)) # this should be the cleansed list
[['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['6', '8', '16', '5', '0'], ['14', '1', '2', '9', '3'], ['14', '11', 'forteen', '8', '20'], ['12', '11', '8', '15', '7'], ['1', '3', '14', '18', '20'], ['5', '3', '19', '20', '0']]

>>> print(invalidList)
[['1', '30', '2', '5', '7'], ['6', '9', '16', '0', ''], ['18', '9', '9', '22', '4'], ['einundzwanzig', '14', '1', '2', '4']]

预期产量:

>>> print(validate(datalist)) # this should be the cleansed list
[['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['6', '8', '16', '5', '0'], ['14', '1', '2', '9', '3'], ['12', '11', '8', '15', '7'], ['1', '3', '14', '18', '20'], ['5', '3', '19', '20', '0']]

>>> print(invalidList)
[['1', '30', '2', '5', '7'], ['6', '9', '16', '0', ''], ['14', '11', 'forteen', '8', '20'],['18', '9', '9', '22', '4'], ['einundzwanzig', '14', '1', '2', '4']]

提前感谢:)


Tags: 代码in列表数字bevalidatelistvalues
3条回答

问题是在循环过程中更改列表会导致意外的结果。我建议不要删除这个元素-只要“标记它”删除,并在返回之前删除它

这是这样做的一个示例,无需修改大部分代码:

datalist = [['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['6', '8', '16', '5', '0'], ['1', '30', '2', '5', '7'], ['14', '1', '2', '9', '3'], ['6', '9', '16', '0', ''], ['14', '11', 'forteen', '8', '20'], ['12', '11', '8', '15', '7'], ['18', '9', '9', '22', '4'], ['1', '3', '14', '18', '20'], ['5', '3', '19', '20', '0'], ['einundzwanzig', '14', '1', '2', '4']]

invalidList = []

def validate(myList): #non-numeric values or values greater than 20 must be removed from myList and added to invalidList
    for lst in myList: # check each list
            for item in lst:# check element in each list
                try:
                    val = int(item)
                    if val >20:
                        raise ValueError
                except ValueError:
                    invalidList.append(lst[:]) # copy the invalid list - otherwise the next line would break it because they share the list object
                    lst.clear() # this will change the invalid list
    return [elem for elem in myList if elem] # empty list evaluate to False

返回值:

>>> validate(datalist)
[['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['6', '8', '16', '5', '0'], ['14', '1', '2', '9', '3'], ['12', '11', '8', '15', '7'], ['1', '3', '14', '18', '20'], ['5', '3', '19', '20', '0']]
>>> invalidList
[['1', '30', '2', '5', '7'], ['6', '9', '16', '0', ''], ['14', '11', 'forteen', '8', '20'], ['18', '9', '9', '22', '4'], ['einundzwanzig', '14', '1', '2', '4']]

为什么会这样?

当您从列表中间移除一个项目时,所有其他元素都会向左移动

这意味着,移除一个元素后,下一个元素跳转到被移除的元素所在的位置。。。但是循环继续,到下一个地方

当您的列表在行中包含两个无效元素时,第二个元素总是被跳过,因为它跳转到该位置,如下所示:

[['16', '10', '8', '3', '7'], #ok
 ['8', '9', '19', '20', '4'], #ok
 ['6', '8', '16', '5', '0'], #ok
 ['1', '30', '2', '5', '7'], #removed
 ['14', '1', '2', '9', '3'], #skipped! but ok
 ['6', '9', '16', '0', ''], #removed
 ['14', '11', 'forteen', '8', '20'], #skipped! but should've been removed
 ['12', '11', '8', '15', '7'], #ok
 ['18', '9', '9', '22', '4'], #removed
 ['1', '3', '14', '18', '20'], #skipped! but ok
 ['5', '3', '19', '20', '0'], #ok
 ['einundzwanzig', '14', '1', '2', '4']] #removed

这是一种使用any()的方法

例如:

datalist = [['16', '10', '8', '3', '7'], ['8', '9', '19', '20', '4'], ['6', '8', '16', '5', '0'], ['1', '30', '2', '5', '7'], ['14', '1', '2', '9', '3'], ['6', '9', '16', '0', ''], ['14', '11', 'forteen', '8', '20'], ['12', '11', '8', '15', '7'], ['18', '9', '9', '22', '4'], ['1', '3', '14', '18', '20'], ['5', '3', '19', '20', '0'], ['einundzwanzig', '14', '1', '2', '4']]

def validate(myList):
    invalidList = []
    validList = []
    for i in myList:
        if any(j=='' or j.isalpha() or int(j) > 20 for j in i):
            invalidList.append(i)
        else:
            validList.append(i)

    return validList, invalidList

print(validate(datalist))  

输出:

([['16', '10', '8', '3', '7'],
  ['8', '9', '19', '20', '4'],
  ['6', '8', '16', '5', '0'],
  ['14', '1', '2', '9', '3'],
  ['12', '11', '8', '15', '7'],
  ['1', '3', '14', '18', '20'],
  ['5', '3', '19', '20', '0']],

 [['1', '30', '2', '5', '7'],
  ['6', '9', '16', '0', ''],
  ['14', '11', 'forteen', '8', '20'],
  ['18', '9', '9', '22', '4'],
  ['einundzwanzig', '14', '1', '2', '4']])

您可以使用一行代码实现所需的功能,如下所示:

validlist = [sublist for sublist in datalist if all(i.isdigit() for i in sublist) and max([int(i) for i in sublist])<=20]

输出:

[['16', '10', '8', '3', '7'], 
['8', '9', '19', '20', '4'],
['6', '8', '16', '5', '0'],
['14', '1', '2', '9', '3'],
['12', '11', '8', '15', '7'],
['1', '3', '14', '18', '20'],
['5', '3', '19', '20', '0']]

相关问题 更多 >