从字典数组中提取项目并创建一个数组?

3

我有一些以这种格式输出的数据:

[{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

这些数据可以包含任意数量的条目。我想要做的是将所有sname的值提取到一个列表中,就像这样:
snames = ['sig1','sig2','sig3','sig4']

我该如何在不提前知道输出长度的情况下对其进行迭代?
3个回答

3
你可以使用列表推导式来完成这个任务:
In [1]: array_of_dicts = [{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

In [2]: snames = [d['sname'] for d in array_of_dicts]

In [3]: print snames
['sig1', 'sig2', 'sig3', 'sig4']

2
你可以使用列表推导式。
使用:
my_dict_list = [{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

您可以通过以下方式获取所有'sname'条目:

my_list = [x['sname'] for x in my_dict_list]

并且

print(my_list)

打印输出
['sig1', 'sig2', 'sig3', 'sig4']

2

最短、最Pythonic的方法是使用列表推导式:

data =  [{'state': 'OK', 'sname': 'sig1', 'extra': None}, {'state': 'OFF', 'sname': 'sig2', 'extra': None}, {'state': 'OK', 'sname': 'sig3', 'extra': None}, {'state': 'UNKNOWN', 'sname': 'sig4', 'extra': None}]

snames = [i['sname'] for i in data if 'sname' in i]

print(snames)
>>> ['sig1', 'sig2', 'sig3', 'sig4']

最好验证一下' sname '是否在字典中,否则您可能会遇到 KeyError ,除非您确定其一致性(在这种情况下,可以摆脱 if 'sname' in i )。


如果我知道列表中有一些字典不包含该键,我才会开始检查。否则,嵌套数据结构中可能无法检测到潜在的不必要错误。但我猜这严重取决于问题本身。 - SmCaterpillar
你说得对,我之前加上了“以防万一”的判断,因为如果我们不确定长度,那么字典也可能是不确定的。我在我的回答中加入了精度。 - d6bels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接