删除由列表和数组组成的python字典中的空值



我想从一个值是列表和数组混合的字典中消除所有空值。所以我尝试了:

res = [ele for ele in ({key: val for key, val in sub.items() if val} for sub in test_list) if ele]

但是我得到了错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). And if I try:

AttributeError: 'list' object has no attribute 'any' 

我得到错误

AttributeError: 'list' object has no attribute 'any'

所以我想知道是否有一种更通用的方法来删除pythondict中的空值。

检查空列表是否为空的常见方法是检查len(list)。假设你的dict()是这样的

myDict = {
1: [1,2,3],
2: [],
3: np.array([[1,2],[3,4],[5,6]])
}

你的列表推导式可能看起来像

res = {k:v for k,v in myDict.items() if len(v)}

注意字典推导式

中的len(v)

我认为您已经使这一步变得比必要的更复杂了(并且没有包括一个完整的示例!)

下面的示例创建一个新的字典res,其中test_dict的所有值都是非空值。我在这里使用len(),因为它适用于列表和nd-数组。对于列表,我将省略对len()的调用,而只使用val

test_dict = {1: [], 2: [1,2,3], 3: [4,5,6]}
res = {key: val for key, val in test_list.items() if len(val)}

如果你想使用any(),你会发现dict值是包含至少一个真值项的列表:

test_dict = {1: [], 2: [1,2,3], 3: [4,5,6]}
res = {key: val for key, val in test_list.items() if any(val)}

@Jacob的回答很好,虽然效率很低。

相反,您可以利用内置的filter()方法过滤掉空字典,并使用dict()方法而不是使用dict推导式:

res = filter(None, (dict(i for i in sub.items() if len(i[1])) for sub in test_list))

相关内容

  • 没有找到相关文章

最新更新