- 这是一个字典列表
- 字典上的某些键(如列表元素中的键(可能包含丢失的值
- 我想从列表中的所有字典中完全删除键,如果它们有空字符串作为值,该值在列表的每个字典元素中。(请参阅代码以获得更好的解释(
- dictionary元素的键值结构保持不变
- 最好是在不使用第三方库的情况下以可能的阿片化方式。我有一个有效的解决方案,它非常贪婪
代码示例
dict_data = [
{"a": "lorem", "b": "ipsum", "c": ""},
{"a": "lorem2", "b": "ipsum1", "c": ""},
{"a": "", "b": "ipsum3", "c": ""},
{"a": "lore3", "b": "", "c": ""}
]
在这种情况下,我想从所有字典中删除关键字"c"
,因为该关键字在列表的每个字典中都没有值(空字符串(。如果将其转换为表结构,则表示没有值的列。
预期结果
结果看起来像这样:
dict_data = [
{"a": "lorem", "b": "ipsum"},
{"a": "lorem2", "b": "ipsum1"},
{"a": "", "b": "ipsum3"},
{"a": "lore3", "b": ""}
]
只有列表中所有字典中的"c"
键被删除。
我一直在努力:
工作,但对for loops
的数量不满意。
# will contain {"key_with_mssing_values": "number_of_rows_that_has_missing_values_for_this_key"}
missing_values_dict = {}
for row in dict_data:
for key, value in row.items():
if not value:
if key in missing_values_dict:
missing_values_dict[key] +=1
else:
missing_values_dict[key] = 1
# missing_values_dict ==> {'c': 4, 'a': 1, 'b': 1}
for key, value in missing_values_dict.items():
# if the value is equal to the length of the list
# it means it is missing values on all the rows/dictionaries
if value == len(dict_data):
[row.pop(key, None) for row in dict_data]
# dict_data
## [{'a': 'lorem', 'b': 'ipsum'}, {'a': 'lorem2', 'b': 'ipsum1'}, {'a': '', 'b': 'ipsum3'}, {'a': 'lore3', 'b': ''}]
我很感激你的帮助。非常感谢。
如果需要检查ALL行为空,则不需要迭代所有行中的所有元素。只是以前空的。
empty = set(dict_data[0].keys())
for d in dict_data:
for k in empty.copy():
if d[k] != "":
empty -= {k}
for k in empty:
for d in dict_data:
d.pop(k, None)
print(dict_data)
输出:
[{'a': 'lorem', 'b': 'ipsum'},
{'a': 'lorem2', 'b': 'ipsum1'},
{'a': '', 'b': 'ipsum3'},
{'a': 'lore3', 'b': ''}]