【问题标题】:How can I remove None values of one list and the equivalent values from another?如何删除一个列表的 None 值和另一个列表的等效值?
【发布时间】:2021-05-20 11:02:33
【问题描述】:

我一直在尝试解决这个问题。我想要做的是从列表中删除 None 值,例如:

list1 = [2,3,4,None,2,4,5]

我还有其他列表,它们的值与 list1 值相关(假设 list1 是天,另外两个是这些列表中发生的事情):

list1 = [2,3,4,None,2,4,5]

list2 = ['red','blue','white','red','blue','blue','blue']

我想从另一个列表中删除 None 值以及 red。所以我希望它们看起来像:

list1 = [2,3,4,2,4,5]

list2 = ['red','blue','white','blue','blue','blue']

我尝试过的如下:

    for j in array_length(list1):
        
        if list1[j] is None: #if value is None
            print("Missing values. Omitting day.")
            del list1[j] #deleting that day from all datasets
            del list2[j]
            

array_length 是我创建的一个函数,它为我提供了一个从 0 到目标列表长度的数组。上面的代码不起作用,因为它给了我以下错误:

IndexError: list index out of range

我认为正在发生的事情是索引没有正确更新,但我不知道如何解决或绕过它。

【问题讨论】:

  • list1list2 是列表还是元组?将括号更改为方括号。 list1=[2,3,4,None,2,4,5]
  • 感谢编辑!

标签: python list for-loop if-statement nonetype


【解决方案1】:

问题是因为您在循环时从列表中删除项目。因此,当您开始循环时,列表​​的长度为 7,但是由于您在中间删除了一项,因此循环在最后阶段超出了索引。 教训:循环使用时不要从列表中删除。

但是这里有一种方法可以做到这一点而不会导致错误

list1 = [2,3,4,None,2,4,5]
list2 = ['red','blue','white','red','blue','blue','blue']
for i, val in enumerate(list1):
  if val is None:
    del list1[i]
    del list2[i]

【讨论】:

  • 效果不错,建议把==改成is like - if val is None:
  • @Epsi95 这个不会造成问题。因为我正在使用枚举
【解决方案2】:

你可以试试zipall

list1 = (2,3,4,None,2,4,5)

list2 = ('red','blue','white','red','blue','blue','blue')

l = [i for i in zip(list1, list2) if all(i)]

l1 = [i[0] for i in l]
l2 = [i[1] for i in l]

print(l1, l2)
[2, 3, 4, 2, 4, 5] 
['red', 'blue', 'white', 'blue', 'blue', 'blue']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-28
    • 2023-03-06
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多