如何使用Python搜索字典值是否包含特定字符串
我有一本有键值对的字典。我的值包含字符串。如何搜索字典中是否存在特定字符串并返回与包含该值的键相对应的键 假设我想搜索字典值中是否存在字符串“Mary”,并获取包含该字符串的键。这是我尝试过的,但显然不起作用如何使用Python搜索字典值是否包含特定字符串,python,string,dictionary,key-value,Python,String,Dictionary,Key Value,我有一本有键值对的字典。我的值包含字符串。如何搜索字典中是否存在特定字符串并返回与包含该值的键相对应的键 假设我想搜索字典值中是否存在字符串“Mary”,并获取包含该字符串的键。这是我尝试过的,但显然不起作用 #Just an example how the dictionary may look like myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'], 'firstName'
#Just an example how the dictionary may look like
myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'],
'firstName': ['Alan', 'Mary-Ann'], 'lastName': ['Stone', 'Lee']}
#Checking if string 'Mary' exists in dictionary value
print 'Mary' in myDict.values()
是否有更好的方法来执行此操作,因为我可能希望查找存储值的子字符串(“Mary”是值“Mary Ann”的子字符串)。您可以这样做:
#Just an example how the dictionary may look like
myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'],
'firstName': ['Alan', 'Mary-Ann'], 'lastName': ['Stone', 'Lee']}
def search(values, searchFor):
for k in values:
for v in values[k]:
if searchFor in v:
return k
return None
#Checking if string 'Mary' exists in dictionary value
print search(myDict, 'Mary') #prints firstName
Klaus解决方案的开销较小,另一方面,此解决方案可能更具可读性
myDict = {'age': ['12'], 'address': ['34 Main Street, 212 First Avenue'],
'firstName': ['Alan', 'Mary-Ann'], 'lastName': ['Stone', 'Lee']}
def search(myDict, lookup):
for key, value in myDict.items():
for v in value:
if lookup in v:
return key
search(myDict, 'Mary')
如果研究涉及更多的关键点,也许你应该为我创建一个包含所有关键点的列表,这同样有效:
def search(myDict, search1):
search.a=[]
for key, value in myDict.items():
if search1 in value:
search.a.append(key)
search(myDict, 'anyName')
print(search.a)
- search.a使列表成为全局可用的
- 如果在任何值中找到子字符串的匹配项,则该值的键 值将附加到
- 以下是一行可接受答案。。。(适用于一线爱好者)
导入json
json.dumps(myDict)中的“mtach”
如果找到,则为true我有点晚了,但另一种方法是使用列表理解和
any
函数,该函数接受一个iterable并在一个元素为true时返回true
:
#检查字典值列表中是否存在字符串“Mary”
为myDict.values()中的子列表打印任何(s中的any('Mary'表示子列表中的s))
如果要计算其中包含“Mary”的元素的数量,可以使用sum()
:
#包含“Mary”的子列表数
为myDict.values()中的子列表打印总和(s中的any('Mary'表示子列表中的s))
#包含“Mary”的字符串数
为myDict.values()中的子列表打印sum(s中的sum('Mary'表示子列表中的s))
通过这些方法,我们可以很容易地生成函数来检查哪些键或值匹配
要获取包含“Mary”的密钥,请执行以下操作:
def匹配键(字典、搜索字符串):
return[key for key,dictionary.items()中的val(如果有)(searchString in s for s in val)]
要获取子列表,请执行以下操作:
def匹配值(字典、搜索字符串):
返回[val for dictionary.values()中的val(如果有)(s中的searchString for val中的s)]
要获取字符串,请执行以下操作:
def匹配值(字典、搜索字符串):
返回[s for s i for val in dictionary.values()如果有(s中的searchString for s in val)]
要同时实现这两个目标:
def matchingElements(字典、搜索字符串):
返回{key:val代表key,val在dictionary.items()中,如果有(searchString在s中代表s在val中)}
如果您只想获取包含“Mary”的字符串,可以执行双列表理解:
def匹配字符串(字典、搜索字符串):
返回[s for val in dictionary.values()for s in val if searchString in s]
如果我有100万条记录,并且我正在实现自动完成搜索,那么性能问题将是什么。@未知您绝对不应该为您的案例执行此操作。您需要在单独的反向查找字典中为值编制索引。或者,如果您知道字典很大,可以将其转换为JSON并执行正则表达式搜索,例如pattern=r'\w+(?=”:[\S\S][^:::+{})。格式(搜索文本)
获取密钥。对于较小的字典来说不会更快,但对于较大的字典来说会更快,尤其是当数据处于我刚刚了解到的最糟糕的位置时,即搜索。a不是一种使全局可用的智能方法。目前,这可能会有帮助:通过:def search(myDict,search1)找到解决方案:a=[]对于键,myDict.items()中的值:如果在值中搜索1:a.append(key)返回x=search(myDict,'anyName')打印(str(x))def search(myDict,search1):a=[]对于键,myDict.items()中的值:如果在值中搜索1:a.append(key)返回x=search(myDict,'anyName')打印(str(x))啊,明白了。你可以在一行中这样做:search_dict=lambda x,y:((k如果y在v中,那么v在x中没有[k])对于k在x中)
我得到一个错误列表索引必须是整数或切片,而不是list
@AndreaCiufo给出您的代码..我想您的dict在一个键中包含多个值..我使用了问题代码,实际上包含一个字符串列表,类似于@Nei oversight:)@AndreaCiufo问题现在解决了吗?我想您的swer有点不对劲。根据用户在问题中使用的词典,查看获取密钥的方法,它返回以下错误消息:in(.0)--->1打印(sum(1表示密钥,如果val中的'Mary'则为myDict中的val)>0)值错误:太多值无法解压缩(预期为2)
与(.0)1 def matchingKeys(dictionary,searchString)中的matchingKeys
函数相同:-->2返回[key for key,val in dictionary if searchString in val]值错误:要解压缩的值太多(预期为2)@AndreaCiufo糟糕,我忘了使用dict.items方法。我想给出一个概念,一个使用单行列表理解的想法,但通过反复阅读,我意识到我犯了很多错误。发生这种情况是因为有一个与键关联的字符串列表,而不是一个字符串:)正是这样,我放弃了t dict.items:)我知道我写答案时在想什么,我想我也去了fast@paranormaldist好的,您必须将字符串列表或元组作为输入,然后将dict的每个字符串与输入中的每个字符串进行比较。这意味着将any(searchString in s for s in val)
替换为any(any(在s中搜索)在val中搜索s在searchString中搜索)
或类似的内容。但是它只在一行上变得很长,所以您最好在多行上执行,或者将其划分为函数
import re
for i in range(len(myDict.values())):
for j in range(len(myDict.values()[i])):
match=re.search(r'Mary', myDict.values()[i][j])
if match:
print match.group() #Mary
print myDict.keys()[i] #firstName
print myDict.values()[i][j] #Mary-Ann
import re
for i in range(len(myDict.values())):
for j in range(len(myDict.values()[i])):
match=re.search(r'Mary', myDict.values()[i][j])
if match:
print match.group() #Mary
print myDict.keys()[i] #firstName
print myDict.values()[i][j] #Mary-Ann
def search(myDict, lookup):
a=[]
for key, value in myDict.items():
for v in value:
if lookup in v:
a.append(key)
a=list(set(a))
return a
def search(myDict, search1):
search.a=[]
for key, value in myDict.items():
if search1 in value:
search.a.append(key)
search(myDict, 'anyName')
print(search.a)
def search_dict(my_dict,searchFor):
s_val = [[ k if searchFor in v else None for v in my_dict[k]] for k in my_dict]
return s_val