繁体   English   中英

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

[英]Python find value in dictionary inside a list

我正在尝试使用values()方法为480-888-0050返回True ,该方法位于contacts字典内的列表中,但它似乎没有在键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

进程以退出代码 0 结束

有人可以帮我弄这个吗?

您可以编写一个函数来尝试以不同于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")

修正了我之前的回答:

'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-5555'] ,而不是'480-888-0050'因此搜索元素,您需要在子列表中搜索。 用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM