如何确保在删除某些元素时检查列表中的每个元素

时间:2019-06-11 20:08:14

标签: python list

我有一个具有这样布局的多维列表

['Company Name', ['companyemail@email.com']]
['Company Name', ['companyemail@email.com','companyemail@email.com']]
['Company Name', ['companyemail@email.com']]

列表中大约有500行。但是,由于企业环境的低效率,一些供应商还没有提供可靠的联系信息,这就是结果:

['Company Name', ['companyemail@email.com']]
['Company Name', ['companyemail@email.com','companyemail@email.com']]
['Company Name', []]
['Company Name', []]

我创建了一个for循环,用于检查列表中第二个元素是否为空,但是似乎列表中80%的元素都停止了删除应该删除的元素。

我想我知道为什么要这样做,并且因为我的for循环是这样的:

count=0
  for k in (list1):
    if not list1[count][1]:
      list1.pop(count)
    else:
      count+=1

它曾经是:

count=0
  for k in (list1):
    if not list1[count][1]:
      list1.pop(count)
    count+=1

但是我必须更改它,因为我注意到列表中是否有需要删除的项目,并且它们彼此相邻,第二个将被跳过,因为count变量将在项目的位置加1会回去的。

3 个答案:

答案 0 :(得分:2)

您可以使用python过滤器来代替for循环。

list(filter(lambda x: x[1]!=[],list1))

使用此过滤器,您可以循环访问列表中的所有元素,并检查第二个元素是否不等于空列表。如果是这样,则保留它,否则将其删除。然后,仅使用此元素创建一个新列表。

答案 1 :(得分:1)

Syrius的回答很不错。如果您想知道代码为什么有问题,可以遍历列表并同时对其进行修改。为防止这种情况,您可以向后遍历列表。在这里,我还使用范围来提供索引而不是计数变量。

for k in range(len(list1) -1, 0, -1):
    if not list1[k][1]:
        list1.pop(k)

您仍在修改list1,但是修改不会影响连续迭代中发生的操作。

答案 2 :(得分:1)

使用索引删除比使用列表理解要慢得多。您应该以更“ Pythonic”的方式进行操作:

list1 = [ company for company in list1 if company[1] ]