Python密钥存在:Key是整数和字符串的元组

add*_*ons 2 python dictionary tuples

我有一个python字典,我建立了它的键是一个元组,值列在列表中.元组包含整数和字符串.这里最好的描述是一个简单的例子:

>>> x = {(1, 'test'): ['marry', 'tom']}
Run Code Online (Sandbox Code Playgroud)

我想构建一个逻辑,如果字典键中元组的第一个元素存在我的逻辑:

所以我试着跟随:

>>> if 1 in x:
...     print x
... 
Run Code Online (Sandbox Code Playgroud)

它不起作用.

但后来我做了以下测试,如果在函数工作时键不是一个元组,它确实:

>>> y = {}
>>> y[1] = []
>>> y[1].append("tom")
>>> if 1 in y:
...     print y
... 
{1: ['tom']}
Run Code Online (Sandbox Code Playgroud)

如果密钥恰好是元组的第一个元素,如何检查密钥是否存在于字典中.

Mar*_*ers 8

您需要测试完整密钥:

(1, 'test') in x
Run Code Online (Sandbox Code Playgroud)

元组键并不特殊,使用元组作为键并不意味着元组中的两个元素都成为单独的键.

如果您需要两者1'test'成为键,则需要将它们分别添加为键,或者单独测试字典中的每个键.

您可以对dict类型进行子类化并对其进行扩展以支持您的解释:

class tupledict(dict):
    def __contains__(self, key):
        if super(tupledict, self).__contains__(key):
            return True
        return any(key in k for k in self)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> x = tupledict({(1, 'test'): ['marry', 'tom']})
>>> 1 in x
True
>>> (1, 'test') in x
True
Run Code Online (Sandbox Code Playgroud)


jon*_*rpe 8

如果您只知道密钥的第一部分,则可以查看any密钥是否包含密钥:

if any(k[0] == 1 for k in x):
Run Code Online (Sandbox Code Playgroud)

或者,获取匹配键列表:

keys = [k for k in x if k[0] == 1]
Run Code Online (Sandbox Code Playgroud)