我想从一个值是列表和数组混合的字典中消除所有空值。所以我尝试了:
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))