删除列表中所有字典中具有空字符串的键(本质上是删除空列)


  • 这是一个字典列表
  • 字典上的某些键(如列表元素中的键(可能包含丢失的值
  • 我想从列表中的所有字典中完全删除键,如果它们有空字符串作为值,该值在列表的每个字典元素中。(请参阅代码以获得更好的解释(
  • 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': ''}]

最新更新