假设我有一个如下所示的词典列表:
[{1: "a"}, {2: "b"}]
指示某个键是否在列表中的某个词组中的pythonic方法是什么?
答案 0 :(得分:46)
我可能会写:
>>> 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
不存在,则会>>> 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
:
next
如果您想避免这种情况,您可以捕获异常或传递None
默认值,例如>>> next((i for i,d in enumerate(lod) if 3 in d), None)
>>>
:
>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}]
>>> [i for i,d in enumerate(lod) if 2 in d]
[1, 2]
如@drewk的评论所述,如果你想在多个值的情况下返回多个索引,你可以使用列表理解:
{{1}}
答案 1 :(得分:2)
将any
函数与生成器一起使用:
>>> d = [{1: "a"}, {2: "b"}]
>>> any(1 in x for x in d)
True
如果传递给any
的{{1}}中的至少一个元素为True
,则 iterable
函数返回True
。但是你真的需要考虑,为什么你没有在一个key: value
中拥有所有dict
对?
答案 2 :(得分:1)
parsedData=[]
dataRow={}
if not any(d['url'] == dataRow['url'] for d in self.parsedData):
self.parsedData.append(dataRow)
答案 3 :(得分:0)
要查看单个dictoray,我们使用'in'关键字:
key in dic_instance
要检入字典列表,遍历字典列表并使用“任何”功能,因此如果在任何字典中找到密钥,它将不会进一步迭代列表。
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
答案 4 :(得分:0)
为了搜索深度嵌套的数据结构,我使用此代码以递归方式在列表和字典中查找键
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
答案 5 :(得分:-1)
我被python2 vs python3的可能吓了一跳。我将根据最终对python3所做的回答。我的目标很简单:检查字典格式的json响应是否给出错误。我的字典叫做“令牌”,我要寻找的密钥是“错误”
if ((token.get('error', None)) is None):
do something
我正在寻找键“错误”,如果它不存在,则将其设置为“无”,然后检查其值为“无”,如果是,则继续执行我的代码。如果没有键“ error
,则使用其他语句来处理