Python在列表中的字典中查找值

Python在列表中的字典中查找值,python,Python,我试图使用480-888-0050的values()方法返回True,该方法位于联系人字典中的列表中,但它似乎没有深入到键Mike的列表中 contacts = { 'Ingemar': '480-555-7777', 'Mike': ['480-888-0050', '480-555-5555'] } print('480-555-7777' in contacts.values()) print('480-888-0050' in contacts.values())

我试图使用
480-888-0050
values()
方法返回
True
,该方法位于
联系人
字典中的列表中,但它似乎没有深入到键
Mike
的列表中

contacts = {
    'Ingemar': '480-555-7777', 
    'Mike': ['480-888-0050', '480-555-5555']
}

print('480-555-7777' in contacts.values())
print('480-888-0050' in contacts.values())

print(contacts.values())
输出:

True
False
dict_values(['480-555-7777', ['480-888-0050', '480-555-5555']])  <<< clearly sees the values
True
假的

dict_值(['480-555-7777',['480-888-0050','480-555-5555'])您可以编写一个函数,尝试以不同于
列表的方式处理
str

def contains(element, value):
    if isinstance(value, str):
        return element == value
    elif isinstance(value, list):
        return element in value
    return False
然后,您可以在生成器表达式中使用此函数与
any

>>> any(contains('480-555-7777', value) for value in contacts.values())
True
>>> any(contains('480-888-0050', value) for value in contacts.values())
True

您可以编写一个函数,尝试以与
list
不同的方式处理
str

def contains(element, value):
    if isinstance(value, str):
        return element == value
    elif isinstance(value, list):
        return element in value
    return False
然后,您可以在生成器表达式中使用此函数与
any

>>> any(contains('480-555-7777', value) for value in contacts.values())
True
>>> any(contains('480-888-0050', value) for value in contacts.values())
True

您的问题是一些值在键中,而另一些值在列表中。使用列表值的理解列表可以实现这个技巧。如果您想在dict中的任何位置测试值,可以执行以下操作:

values = contacts.values()
if '480-888-0050' in [x for v in values for x in v if type(v)==list] or '480-888-0050' in values:
    print("Value found")

您的问题是一些值在键中,而另一些值在列表中。使用列表值的理解列表可以实现这个技巧。如果您想在dict中的任何位置测试值,可以执行以下操作:

values = contacts.values()
if '480-888-0050' in [x for v in values for x in v if type(v)==list] or '480-888-0050' in values:
    print("Value found")

该列表包含
['480-888-0050','480-555-5555']
,而不是
'480-888-0050'
因此,搜索元素时,需要在子列表中进行搜索。 使用:


该列表包含
['480-888-0050','480-555-5555']
,而不是
'480-888-0050'
因此,搜索元素时,需要在子列表中进行搜索。 使用:


修正了我之前的答案:

“480-888-0050”不是列表中的值

['480-555-7777'、['480-888-0050'、'480-555-5555']

它是列表中列表中的一个值,如果要检查所有可用值,要合并所有列表,可以执行以下操作:

from itertools import chain

numbers = list(chain.from_iterable(
[l if isinstance(l, list) else [l] for l in contacts.values()]))

print('480-888-0050' in contacts.values())

修正了我之前的答案:

“480-888-0050”不是列表中的值

['480-555-7777'、['480-888-0050'、'480-555-5555']

它是列表中列表中的一个值,如果要检查所有可用值,要合并所有列表,可以执行以下操作:

from itertools import chain

numbers = list(chain.from_iterable(
[l if isinstance(l, list) else [l] for l in contacts.values()]))

print('480-888-0050' in contacts.values())


什么在生成联系人?如果是您的代码,那么始终使用列表可能会更容易,即
['480-555-7777']
,那么itertools.chain.from iterable(contacts.values())
itertools.chain.from iterable(contacts.values())
中的
'480-888-0050'都将
为True
。生成
联系人的原因是什么?如果是您的代码,那么始终使用列表可能会更容易,即
['480-555-7777']
,然后在itertools.chain.from_iterable(contacts.values())
中使用
'480-555-7777',在itertools.chain.from_iterable(contacts.values())中使用
'480-888-0050'
将为
True
。这不适用于值为单个字符串的情况,而不是字符串列表。只要值是混合类型,这将中断。@CoryKramer,能否详细说明“值为单个字符串时不工作”。联系人={'Ingemar':'480-555-7777','Mike B':['480-888-0050']}打印(任何('480-888-0050'在contacts.values()中的子列表中)打印(contacts)似乎也能正常工作?@CoryKramer它也能正常工作。我检查了打印(contacts.values()中的子列表的子列表中的任何('480-555-7777'))这不适用于值为单个字符串的情况,而不是字符串列表。只要值为混合类型,这将中断。@CoryKramer,您能否详细说明“值为单个字符串时不工作”。联系人={'Ingemar':'480-555-7777','Mike B':['480-888-0050']}打印(任何)('480-888-0050'在contacts.values()中的子列表中)打印(contacts)似乎也能正常工作?@CoryKramer它也能正常工作。我检查了打印(contacts.values()中的子列表的子列表中的任何('480-555-7777'))回答得很好!只有一个问题,当你计算出值是一个列表时,为什么要用any来检查元素是否在值中?在value
中返回元素不也会起作用吗?@Eric Oh是的,这是一个很好的观点。我想我后来开始考虑使用
any
,是的
中的
在这种情况下会更好。会吗请给出一个例子,使用"返回value中的元素,而不是使用any。回答得很好!只有一个问题,当你知道value是一个列表时,为什么要使用any来检查元素是否在value中?
返回value中的元素
会不会也起作用?@Eric哦,是的,很好。我想我后来开始考虑使用
any
,是的
 在这种情况下,in
会更好。请给出一个使用“返回值中的元素,而不是使用任何”的示例。