在字典键中搜索元素

时间:2014-06-11 16:37:17

标签: python dictionary

我有字典

{('22', '83', '75', '5', '8', '7', '9', '12', '16', '17', '22', '23', '24', '18', '14'): 1, 
 ('1', '2', '83', '5', '8', '75', '9', '12', '16', '17', '18', '14'): 1, 
 ('11', '2', '7', '5', '8', '7', '9', '12', '16', '17', '18', '14'): 1}

它的键是元组。

现在我需要搜索其中任何一个键和(83,75)中是否存在一对元素 我还需要确保8375按顺序存在于给定的密钥中。 因此,对于示例字典中的第一个键,这是正确的,但不适用于第二个键。

我知道我可以找到8375的密钥,但我无法验证他们的订单。

5 个答案:

答案 0 :(得分:5)

一个简单的for循环就足够了。如果找不到indexValueError,则'83'函数会抛出'75'。 Pythonic这样做的方法是try-except块。:

my_dict = {('22', '83', '75', '5', '8', '7', '9', '12', '16', '17', '22', '23', '24', '18', '14'): 1, 
           ('1', '2', '83', '5', '8', '75', '9', '12', '16', '17', '18', '14'): 1, 
           ('11', '2', '7', '5', '8', '7', '9', '12', '16', '17', '18', '14'): 1}
keys = []
for key in my_dict:
    try:
        if key.index('75') - key.index('83') == 1:
            keys.append(key)
    except ValueError:
        pass

如果您想在75之后找到包含83的密钥,无论其接近程度如何,您都可以使用此版本:

my_dict = {('22', '83', '75', '5', '8', '7', '9', '12', '16', '17', '22', '23', '24', '18', '14'): 1, 
           ('1', '2', '83', '5', '8', '75', '9', '12', '16', '17', '18', '14'): 1, 
           ('11', '2', '7', '5', '8', '7', '9', '12', '16', '17', '18', '14'): 1}
keys = []
for key in my_dict:
    try:
        if '75' in key[key.index('83'):]:
            keys.append(key)
    except ValueError:
        pass

答案 1 :(得分:2)

也许您可以检查元组中的第一项是否在任何键中,并且一旦找到,就使用元组切片和len(query)来检索下一个索引并检查它们的相等性。试试这个,虽然我还没有测试过。

query = ('83', '75')
mydict = {('22', '83', '75', '5', '8', '7', '9', '12', '16', '17', '22', '23', '24', '18', '14'): 1, 
 ('1', '2', '83', '5', '8', '75', '9', '12', '16', '17', '18', '14'): 1, 
 ('11', '2', '7', '5', '8', '7', '9', '12', '16', '17', '18', '14'): 1}

for k in mydict:
    try:
        i = k.index(query[0])
    except ValueError:
        pass
    else:
        if k[i:i+len(query)] == query:
            return k, '->', mydict[k]

答案 2 :(得分:1)

请使用元组的索引方法

例如,对于第一个关键元组{('22','83','75','5','8','7','9','12','16',' 17','22','23','24','18','14')

>>> a = ('22', '83', '75', '5', '8', '7', '9', '12', '16', '17', '22', '23', '24', '18', '14')
>>> a.index("83")
1
>>> a.index("75")
2

一起,条件表达式为:

>>> "83" in a and "75" in a and a.index("83") == a.index("75") - 1
True

答案 3 :(得分:1)

如果你能发现83存在,但75不存在,那么它显然不存在一对。如果两者都存在,那么您可以测试以查看83和75的索引是否具有等于1的差异。

答案 4 :(得分:0)

基于迭代器的解决方案可能很方便

sentinel = object()
for k in d:
    i = iter(k)
    if '83' in i and next(i, sentinel) == '75':
        print k

('22', '83', '75', '5', '8', '7', '9', '12', '16', '17', '22', '23', '24', '18', '14')