Ava*_*ing 24 python list-comprehension list
我有一个清单:
i = [[1,2,3,[]],[],[],[],[4,5,[],7]]
Run Code Online (Sandbox Code Playgroud)
我想删除所有空列表:
[[1,2,3],[4,5,7]]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
这是我的代码:
res = [ele for ele in i if ele != []]
Run Code Online (Sandbox Code Playgroud)
Muh*_*wan 15
使用递归函数从列表中删除空列表。
使用递归,您可以删除任何深度的空列表:
def remove_nested_list(listt):
for index, value in enumerate(reversed(listt)):
if isinstance(value, list) and value != []:
remove_nested_list(value)
elif isinstance(value, list) and len(value) == 0:
listt.remove(value)
a = [[1, 2, 3, 0, []], [], [], [], [4, 5, [], 7]]
print(f"before-->{a}")
remove_nested_list(a)
print(f"after-->{a}")
Run Code Online (Sandbox Code Playgroud)
def remove_nested_list(listt):
for index, value in enumerate(reversed(listt)):
if isinstance(value, list) and value != []:
remove_nested_list(value)
elif isinstance(value, list) and len(value) == 0:
listt.remove(value)
a = [[1, 2, 3, 0, []], [], [], [], [4, 5, [], 7]]
print(f"before-->{a}")
remove_nested_list(a)
print(f"after-->{a}")
Run Code Online (Sandbox Code Playgroud)
从任意嵌套的列表中删除空列表。我们可以在这里使用递归。这是一个简单的方法。我们需要遍历列表并检查元素是否为空列表。如果是,那么我们不会将其添加到最终列表中。如果它不是空列表,我们重复上述过程。
def remove_empty(lst):
return (
[remove_empty(i) for i in lst if i!=[]]
if isinstance(lst, list)
else lst
)
Run Code Online (Sandbox Code Playgroud)
输出:
i = [[1, 2, 3, []], [], [], [], [4, 5, [], 7]]
print(remove_empty(i))
# [[1, 2, 3], [4, 5, 7]]
# Example taken from iGian's answer
ii = [[1, 2, 3, []], [], [], [], [4, 5, [], 7, [8, 9, [], [10, 11, []]]]]
print(remove_empty(ii))
# [[1, 2, 3], [4, 5, 7, [8, 9, [10, 11]]]]
Run Code Online (Sandbox Code Playgroud)
要检查对象是否可迭代,我们使用 collection.abc.iterable
from collections.abc import Iterable
all(
isinstance(i, Iterable)
for i in ([], tuple(), set(), dict(), range(10), (_ for _ in range(10)))
)
# True
Run Code Online (Sandbox Code Playgroud)
现在,您可以替换isinstance(lst, list)使用isinstance(lst, Iterable),以过滤掉空单,即[]从每一个迭代。
@Teepeemm指出了一个绝妙的角落案例,所有答案都错过了。
为了解决这个问题,我们需要两个递归函数,一个用于检查它是否为空嵌套列表,第二个用于删除空嵌套列表
def empty(lst):
if lst == []:
return True
elif isinstance(lst, list):
return all(empty(i) for i in lst)
else:
return False
def remove_empty(lst):
return (
[remove_empty(i) for i in lst if not empty(i)]
if isinstance(lst, list)
else lst
)
i = [[1, 2, 3, [[]]]]
remove_empty(i)
# [[1, 2, 3]]
remove_nested_list(i) # Muhammad Safwan's answer
print(i) # [[1, 2, 3, []]]
ii = [[1, 2, 3, [[], [[[[], []]]]]]]
remove_empty(ii)
# [[1, 2, 3]]
remove_nested_list(ii) # Muhammad Safwan's answer
print(ii) # [[1, 2, 3, [[[[]]]]]]
Run Code Online (Sandbox Code Playgroud)