我有一个Json数组,其中有键值对。我想要得到列表中某个键的值。我不知道键在数组中的位置,所以我不能在数组中使用索引。
请问我怎么拿到这个?我尝试过下面的代码来获得'filterB'的值,这是'val1',但没有运气。谢谢。
import json
x = '{"filters":[{"filterA":"All"},{"filterB":"val1"}]}'
y = json.loads(x)
w = y['filters']['filterB']
print (w)
w = y['filters']['filterB']
不工作,因为y['filters']
是list
而不是dict
。
你的问题的答案取决于你想如何处理filters
列表中有filterB
键的多个字典的情况。
import json
x = '{"filters":[{"filterA":"All"},{"filterB":"val1"}]}'
y = json.loads(x)
# all filterB values
filter_b_values = [x['filterB'] for x in y['filters'] if 'filterB' in x.keys()]
# take first filterB value or None if no values
w = filter_b_values[0] if filter_b_values else None
您的数据(json)的来源与您想要的无关,这是在y['filters']
中找到包含一个名为filterB
的键的字典。要做到这一点,您需要遍历列表并查找满足此条件的项。
w = None
for item in y['filters']:
if 'filterB' in item:
w = item['filterB']
break
print(w) # val1
或者,您可以将所有字典合并为一个字典,并像您最初尝试的那样使用它
all_dict = dict()
for item in y['filters']:
all_dict.update(item)
# Replace the list of dicts with the dict
y['filters'] = all_dict
w = y['filters']['filterB']
print(w) # val1
如果列表中有多个字典满足此条件,并且您希望w
是所有这些值的列表,您可以这样做:
y = {"filters":[{"filterA":"All"},{"filterB":"val1"},{"filterB":"val2"}]}
all_w = list()
for item in y['filters']:
if 'filterB' in item:
all_w.append(item['filterB'])
或者,作为列表推导式:
all_w = [item['filterB'] for item in y['filters'] if 'filterB' in item]
print(all_w) # ['val1', 'val2']
请注意,列表推导式只是创建列表的迭代的语法糖。将常规循环写成列表推导式
并不能避免任何循环。