[英]get items from a dict with tuple keys in python
我有一個帶有元組鍵的字典,如下所示
{('age', 'Low', 'Pos') : 3 ,
('age', 'High', 'Pos') : 11 ,
('age', 'Low', 'Neg') : 8 ,
('age', 'High', 'Neg') : 8 ,
('sex', 'male', 'Pos') : 13 ,
('sex', 'female', 'Pos') : 1 ,
('sex', 'male', 'Neg') : 10 ,
('sex', 'female', 'Neg') : 6}
現在我想獲取索引0,1相同的鍵
例如:
('sex', 'female', 'Pos') , ('sex', 'female', 'Neg')
or
('age', 'Low', 'Pos') , ('age', 'Low', 'Neg')
如何在python中做到這一點?
這是我目前擁有的:
x = [i for i in d.keys() if i[0]=='age' and i[1]=='Low']
對於您要執行的操作類型,我認為這不是最好的數據結構(我認為嵌套字典會更有意義)。 盡管如此,假設您有充分的理由以這種方式存儲它,一個解決方案是對索引0和1使用groupby
:
from itertools import groupby
data = {('age', 'Low', 'Pos') : 3 ,
('age', 'High', 'Pos') : 11 ,
('age', 'Low', 'Neg') : 8 ,
('age', 'High', 'Neg') : 8 ,
('sex', 'male', 'Pos') : 13 ,
('sex', 'female', 'Pos') : 1 ,
('sex', 'male', 'Neg') : 10 ,
('sex', 'female', 'Neg') : 6}
sorted_keys = sorted(data.keys())
index_groups = {k: list(m) for k, m in groupby(sorted_keys, lambda x: x[:2]}
# index_groups is a dict of list with all keys grouped by index 0, 1
您可以對鍵進行切片以獲得前兩個索引,並使用defaultdict來收集它們:
from collections import defaultdict
data = {
('age', 'Low', 'Pos') : 3 ,
('age', 'High', 'Pos') : 11 ,
('age', 'Low', 'Neg') : 8 ,
('age', 'High', 'Neg') : 8 ,
('sex', 'male', 'Pos') : 13 ,
('sex', 'female', 'Pos') : 1 ,
('sex', 'male', 'Neg') : 10 ,
('sex', 'female', 'Neg') : 6
}
prefix2 = defaultdict(list)
for tuple_key in data:
prefix2[tuple_key[:2]].append(tuple_key)
# jump through some hoops to get pretty output
import pprint
print pprint.pprint(dict(prefix2)) # converts back to regular dict since pprint likes them better
上面的輸出是:
{('age', 'High'): [('age', 'High', 'Neg'), ('age', 'High', 'Pos')],
('age', 'Low'): [('age', 'Low', 'Pos'), ('age', 'Low', 'Neg')],
('sex', 'female'): [('sex', 'female', 'Pos'), ('sex', 'female', 'Neg')],
('sex', 'male'): [('sex', 'male', 'Pos'), ('sex', 'male', 'Neg')]}
一個簡單的方法:
x = [[k for k in d.keys() if k[:2] == s] for s in set(k[:2] for k in d.keys())]
這會將您的鍵分組在具有相同前兩個元素的列表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.