假设我有一个长得像这样的字典列表:
[{1: "a"}, {2: "b"}]
在列表中的某个字典中,指示特定键是否存在的Pythonic方式是什么?
假设我有一个长得像这样的字典列表:
[{1: "a"}, {2: "b"}]
在列表中的某个字典中,指示特定键是否存在的Pythonic方式是什么?
我可能会写:
>>> lod = [{1: "a"}, {2: "b"}]
>>> any(1 in d for d in lod)
True
>>> any(3 in d for d in lod)
False
如果在这个列表中将会有很多字典,你可能需要重新考虑你的数据结构。
如果你想要找到第一个匹配项所在的索引和/或字典,一种方法是使用next
和enumerate
:
>>> next(i for i,d in enumerate(lod) if 1 in d)
0
>>> next(d for i,d in enumerate(lod) if 1 in d)
{1: 'a'}
>>> next((i,d) for i,d in enumerate(lod) if 1 in d)
(0, {1: 'a'})
如果找不到它,这将引发 StopIteration :
<code>>>> next(i for i,d in enumerate(lod) if 3 in d)
Traceback (most recent call last):
File "<ipython-input-107-1f0737b2eae0>", line 1, in <module>
next(i for i,d in enumerate(lod) if 3 in d)
StopIteration
</code>
如果你想避免这种情况,你可以捕获异常或将
next
传递默认值,比如None
:
>>> next((i for i,d in enumerate(lod) if 3 in d), None)
>>>
正如@drewk在评论中所指出的那样,如果你想在有多个值的情况下返回多个索引,可以使用列表解析:
>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}]
>>> [i for i,d in enumerate(lod) if 2 in d]
[1, 2]
key in dic_instance
要在字典列表中检查,请遍历字典列表并使用“any”函数,因此如果在任何一个字典中找到键,它将不会进一步遍历列表。
dic_list = [{1: "a"}, {2: "b"}]
any(2 in d for d in dic_list)
True
any(4 in d for d in dic_list)
False
可以使用生成器(generator)与任何函数(function)一起使用:
>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True
any
函数会返回True
,只要传递给它的iterable
中至少有一个元素为True
。但是你真的需要考虑,为什么不把所有的key: value
对放在一个单独的dict
中?
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
self.parsedData.append(dataRow)
您可以使用以下代码检查字典列表中是否存在某个键:<Key> in <Dictionary>
和 <Key> in <Dictionary>.keys()
:
dict_list = [{1: "a"}, {2: "b"}]
# <Key> in <Dictionary>
print(any(1 in dict for dict in dict_list)) # True
print(any(3 in dict for dict in dict_list)) # False
# <Key> in <Dictionary>.keys()
print(any(1 in dict.keys() for dict in dict_list)) # True
print(any(3 in dict.keys() for dict in dict_list)) # False
def isKey(dictORlist, key):
# dictORlist is the data structure you want to search
# key is the keyword you want to search for
def checkList(List, key):
if isinstance(List, list):
for i in List:
return isKey(i, key)
result = checkList(dictORlist, key)
if isinstance(dictORlist, dict):
for k in dictORlist.keys():
data = dictORlist[k]
if k == key:
return True
elif isinstance(data, dict):
result = isKey(data, key)
else:
result = checkList(data, key)
if result == None:
result = False
return result
Python2和Python3的差异让我感到惊讶。我将根据我在Python3中最终采取的方法来回答这个问题。我的目标很简单:检查以字典格式返回的JSON响应是否出错。我的字典名为“token”,我要查找的键是“error”。
if ((token.get('error', None)) is None):
do something
[(i,d) for i,d in enumerate(lod) if 2 in d]
这样的代码。或者使用[i for i,d in enumerate(lod) if 2 in d]
来获取索引列表。 - dawg