访问python字典,其键是带有通配符的元组

时间:2016-07-12 02:18:37

标签: python dictionary

我有一个以元组为键的词典:

d = {
    ('John', 'Blue', 1): 100,
    ('Bill', 'Green', 5): 200,
    ('Paul', 'Blue', 4): 300,
    ('Bill', 'Green', 7): 400
}

是否可以提取匹配的键的值,比如('Bill', 'Green', _),以便输出为[200, 400]

4 个答案:

答案 0 :(得分:4)

不要期望它非常快,但是:

search_key = ("Paul", "Blue")
values = [value for key, value in d.items() if search_key == key[:len(search_key)]]

将返回所有匹配的值。

编辑:将key[:2]替换为key[:len(search_key)]此解决方案也适用于只有一个值的键,例如("Bill",)将返回所有值,其中的键以&#34开头; Bill&#34 ;

答案 1 :(得分:1)

使用列表理解:

[d[k] for k in d.keys() if k[0]=='Bill' and k[1]=='Green']
Out[37]: [400, 200]

答案 2 :(得分:0)

python字典实现为hash table,因此没有有效的方法来查找类似的键,只有完全匹配。您当然可以遍历项目并检查每个键以查看它是否与您的模式匹配。

Python确实有一个groupby函数,如果您要查找多个匹配项,这可能会有所帮助,例如:

from itertools import groupby

d = {
    ('John', 'Blue', 1): 100,
    ('Bill', 'Green', 5): 200,
    ('Paul', 'Blue', 4): 300,
    ('Bill', 'Green', 7): 400
}

keyfunc = lambda (key, value): (key[0], key[1])
g = sorted(d.items(), key=keyfunc)
g = groupby(g, key=keyfunc)

for (partial_key, value) in g:
    print partial_key, len(list(value))
# ('Bill', 'Green') 2
# ('John', 'Blue') 1
# ('Paul', 'Blue') 1

答案 3 :(得分:0)

MaThMaX所遵循的路径的变体

[d[(a,b,c)] for a, b, c in d.keys() if a == 'Bill' and b == 'Green']