Python从列表中删除空项

5

我在Python中为 DynamoBIM 创建了以下列表:

a = [["f", "o", "c"], [null, "o", null], [null, "o", null]]

我想从此列表中删除空项并创建以下列表:
a = [["f", "o", "c"], ["o"], ["o"]]

我尝试过使用list.remove(x)filterfor循环以及其他许多方法,但似乎无法摆脱这些错误。

我该怎么办?


你的列表有多层嵌套? - sshashank124
什么是 null?你是指 None 吗? - taskinoor
谢谢大家!这些都是很好的答案;但这似乎是Dynamo的问题。正如@Arun所指出的,'null'不在Python中。 Dynamo会创建这些'null'项来代替'None',它们以某种方式无法识别为字符串。如果有人在使用Dynamo中遇到此问题,我使用了'Object.IsNull'和'List.FilterByBoolMask'组件来删除'null'项。Valid XHTML - Blake
6个回答

8
假设你的“null”是指“None”,你可以使用列表推导式进行操作:
>>> null = None
>>> nested_list = [["f", "o", "c"], [null, "o", null], [null, "o", null]]
>>> [[x for x in y if x] for y in nested_list]
[['f', 'o', 'c'], ['o'], ['o']]

如果 null 是其他值,您可以将上述内容更改为将 null 的值设置为其他值,并修改理解为:

>>> null = None # Replace with your other value
>>> [[x for x in y if x != null] for y in nested_list]
[['f', 'o', 'c'], ['o'], ['o']]

3
a = [["f", "o", "c"], [None, "o", None], [None, "o", None]]
l = []
for i in a:
    l.append(filter(lambda x: x is not None, i))

print (l)

[['f', 'o', 'c'], ['o'], ['o']]

3

假设你的意思是None,你可以尝试使用filter()函数:

a = [["f", "o", "c"], [None, "o", None], [None, "o", None]]
print [filter(None,x) for x in a] 

>>> 
[['f', 'o', 'c'], ['o'], ['o']]

2

实际上,在Python中没有Null,应该使用类似于字符串的方式。

list_value = [["f", "o", "c"], ['null', "o", 'null'], ['null', "o", 'null']]

[filter(lambda x: x!='null' and x!=None, inner_list) for inner_list in list_value]

[['f', 'o', 'c'], ['o'], ['o']]

你可以使用嵌套列表推导式来解决问题:
[[for i in inner_list if i!='null' and not i] for inner_list in list_value]

1
你可以使用简单的列表推导式:
>>> a = [["f", "o", "c"], [None, "o", null], [null, "o", None]]
>>> a = [[sub for sub in item if sub] for item in a]
>>> a
[['f', 'o', 'c'], ['o'], ['o']]
>>> 

这相当于:

a = [["f", "o", "c"], [None, "o", null], [null, "o", None]]
new = []
for item in a:
    _temp = []
    for sub in item:
        if sub:
            _temp.append(sub)
    new.append(_temp)

a = new

>>> a = [["f", "o", "c"], [None, "o", null], [null, "o", None]]
>>> new = []
>>> for item in a:
...     _temp = []
...     for sub in item:
...         if sub:
...             _temp.append(sub)
...     new.append(_temp)
... 
>>> a = new
>>> a
[['f', 'o', 'c'], ['o'], ['o']]
>>> 

0
在Python中,“None”和NaN(“不是数字”)之间存在差异,有时惯例上称为“null”。 NaN的数据类型通常是浮点型。因此,如果您正在处理仅包含字符串的列表(似乎在这里是这种情况),一个想法是使用列表推导式过滤字符串。
a = ["f", "o", "c", np.nan]
b = [c for c in a if type(c)==str] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接