簡體   English   中英

使用python中的元組鍵從字典中獲取項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM