删除列表中的空嵌套列表

时间:2017-02-14 21:49:51

标签: python list python-3.x

请参阅下面的确切代码。基本上,我试图从csv文件中获取信息,并创建一个包含所有用户名(没有空格或重复项)的列之一的列表。我能够获得所有用户名的列表,但我找不到删除空白的方法。我尝试了过滤器以及其他方法,但似乎无法做到正确。我的代码是:

with open('test.csv') as f:
reader = csv.DictReader(f)
initialExport = []
for row in reader:
    iE = [row['Computer Name'], row['Username']]
    initialExport.append(iE)

for i in initialExport:
    i.pop(0)
finalExport = filter(None, initialExport)
print(finalExport)

4 个答案:

答案 0 :(得分:1)

为什么不首先避免添加空白条目,而不是将其过滤掉:

for row in reader:
    if row['Username']:
        iE = [row['Computer Name'], row['Username']]
        initialExport.append(iE)

答案 1 :(得分:1)

当您尝试过滤它们时,

initialExport是(单例)列表的列表。其中一些列表可能包含空字符串。这不会让他们成为空名单!所以无论如何,他们的真实性都是正确的。您可以通过以下方式过滤掉它们:

finalExport =  [l for l in initialExport if l[0]]

但是,如果只是弹出它,为什么要首先添加Computer Name列?如果您只对一个元素感兴趣,为什么要创建一个嵌套列表:

finalExport = [row['Username'] for row in reader if row['Username']]

答案 2 :(得分:0)

这显示了一种删除空列表,空元组和仅包含lst空列表的列表的方法。以下代码不会删除:

  • 空嵌套元组(具有一个或多个级别)
  • 具有两个以上级别的空嵌套列表

授予lst。

的最后两个条目
import collections

lst = [1, 2, "3", "three", [], [1, 2, "3"], [[], []], 4,
       [[1], []], [[], [], []], 5, "6", (1,2), 7, (),
       ((), ()), [[[]]]]

for index, item in enumerate(lst):
    # if it is an empty list [] or tuple ()
    if not item:
        del lst[index]
    # if it is a list containing only empty sublists [[], [], ...]
    elif isinstance(item, collections.MutableSequence):
        if not [i for sublist in item for i in sublist]:
            del lst[index]

print(lst)

输出:

[1, 2, '3', 'three', [1, 2, '3'], 4, [[1], []], 5, '6', (1, 2), 7, ((), ()), [[[]]]]

在上面的例子中,从lst中删除了四个元素,即[],[[],[]],[[],[],[]]和()。

答案 3 :(得分:0)

purge(list, [elements to purge])将递归清除列表中element的所有副本,并且任何子列表,包括通过删除更深层元素创建的任何元素([[[], []]]将被完全删除)。因为我们正在修改列表,所以每次删除元素时都必须以当前深度重新启动:

def purge(lst, bad):
    restart = True
    while restart:
        restart = False
        for index, ele in enumerate(lst[:]):
            if ele in bad:
                del lst[index]
                restart = True
                break
            elif isinstance(ele, list):
                purge(ele, bad)
                if lst[index] in bad:
                    del lst[index]
                    restart = True
                    break

示例:

>>> lst = [[[[], [[],[]]]]]
>>> purge(lst, [[]])
[]

>>> lst = [1, 2, "3", "three", [], [1, 2, "3"], [[], []], 4,
       [[1], []], [[], [], []], 5, "6", (1,2), 7, [[[]]]]
>>> purge(lst, [[]])
[1, 2, '3', 'three', [1, 2, '3'], 4, [[1]], 5, '6', (1, 2), 7]
>>> purge(lst, ['3'])
[1, 2, 'three', [1, 2], 4, [[1]], 5, '6', (1, 2), 7]
相关问题