我有一个以元组为键的词典:
d = {
('John', 'Blue', 1): 100,
('Bill', 'Green', 5): 200,
('Paul', 'Blue', 4): 300,
('Bill', 'Green', 7): 400
}
是否可以提取匹配的键的值,比如('Bill', 'Green', _)
,以便输出为[200, 400]
?
答案 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']