确定产生 KeyError 的缺失键的位置

Identify location of missing keys that produce KeyError

我有一个大约 58,000 行的列表,每一行都是一个字典。

示例:

my_list_of_dicts = 
[{'id': '555', 'lang': 'en'}, 
{'id': '444', 'lang': 'en'}, 
{'id': '333', 'lang': 'fr'},
{'id': '222', 'lang': 'es'}, 
{'id': '111', 'lang': 'ge'},
{'id': '666', 'lang': 'fr'}, 
{'id': '777', : 'du'}]

在每本词典中,你会看到我有一个键“lang”和对应的值,它是几种语言的缩写('en'、'es'、'fr', 'du', 'ge', 等等...)

我已经成功编写了代码,我需要生成一个系列,其中包含此键中所有唯一值的 value_count。

然而,当我这样做时,我得到一个 KeyError,因为显然有一些字典不包含 'lang' 值。

我创建了一个 try/except 命令,允许我跳过这些缺失值。看起来 58,000 行中大约有 5 行缺少 'lang' 键。

我想找到 'lang' 这些缺失值的位置。换句话说,在大约 58,000 行中,我如何找到哪 5 行缺少 'lang' 键?

在评论中取消上面的答案,

 counter = 0:
 for item in my_list_of dicts:
      if "lang" not in item:
           print(counter)
      counter += 1

要获取 ID 密钥,

for item in my_list_of_dicts:
      if "lang" not in item:
           print(item['id'])

您可以使用 getenumerate:

my_list_of_dicts = 
[{'id': '555', 'lang': 'en'}, 
 {'id': '444', 'lang': 'en'}, 
 {'id': '333', 'lang': 'fr'},
 {'id': '222', 'lang': 'es'}, 
 {'id': '111', 'lang': 'ge'},
 {'id': '666', 'lang': 'fr'}, 
 {'id': '777', "missing_lang": 'du'}]
 missing_vals = [i for i, a in enumerate(my_list_of_dicts) if not a.get("lang", False)]

请记住,您包含的原始字典 : 'du' 是一个无效的键值对,当您 运行 您的文件时会引发错误。因此,为了演示的目的,我添加了一个占位符值。

你的列表不是真实的例子,因为字典中没有键。 让我们假设它看起来像这样: my_list_of_dicts = [ {'id': '555', 'lang': 'en'}, {'id': '444', 'lang': 'en'}, {'id': '777', 'x': 'du'}]

您可以使用以下方法获取包含索引和项目的元组列表:

[(index, item) for index, item in enumerate(my_list_of_dicts) if 'lang' not in item]

由于这个问题被标记为 pandas,您可以尝试 DataFrame 构造函数:

In [11]: my_list_of_dicts = \
    ...: [{'id': '555', 'lang': 'en'},
    ...: {'id': '444', 'lang': 'en'},
    ...: {'id': '333', 'lang': 'fr'},
    ...: {'id': '222', 'lang': 'es'},
    ...: {'id': '111', 'lang': 'ge'},
    ...: {'id': '666', 'lang': 'fr'},
    ...: {'id': '777', }]  # example one with no lang

In [12]: df1 = pd.DataFrame(my_list_of_dicts)

In [13]: df1
Out[13]:
    id lang
0  555   en
1  444   en
2  333   fr
3  222   es
4  111   ge
5  666   fr
6  777  NaN

In [14]: df1[df1.lang.isnull()]  # rows with a NaN (missing) lang
Out[14]:
    id lang
6  777  NaN