0

我有一个名为“score”的字典,其中的键是元组。每个元组的形式为 (x, y, tag)。

一些可能的分数初始化是:

score[(0, 1, 'N')] = 1.0
score[(0, 1, 'V')] = 1.5
score[(0, 1, 'NP')] = 1.2
score[(1, 2, 'N')] = 0.2
score[(1, 2, 'PP')] = 0.1
score[(1, 2, 'V')] = 0.1

我希望能够保持 x 和 y 不变(例如 0、1),然后迭代标签的给定值(例如 N、V、NP)。

那里有任何 Python 天才知道如何做到这一点吗?我正在为此寻找多种选择。谢谢。

4

5 回答 5

8
[tag for x,y,tag in score if x==0 and y==1]
于 2012-05-11T06:59:00.570 回答
7

列表理解怎么样:

[ x[2] for x in score.keys() if x[0:2] == (0,1)]
于 2012-05-11T06:54:53.853 回答
1

您必须遍历所有元素并检查它们的键是否与您要查找的内容匹配。但是,您可以通过使用过滤迭代器很好地做到这一点:

elems = (item for item in score.iteritems() if item[0][:2] == (0, 1))

您还可以使用只为您提供标签值和元素而不是整个项目元组的迭代器:

elems = ((item[0][2], item[1]) for item in score.iteritems() if item[0][:2] == (0, 1))

如果你真的只需要标签值而不是相应的元素,你可以更容易地做到:

tags = [k[2] for k in score if k[:2] == (0, 1)]

演示:

>>> score
{(0, 1, 'NP'): 1.2,
 (0, 1, 'V'): 1.5,
 (1, 2, 'N'): 0.2,
 (1, 2, 'PP'): 0.1,
 (1, 2, 'V'): 0.1}

>>> list(item for item in score.iteritems() if item[0][:2] == (0, 1))
[((0, 1, 'NP'), 1.2), ((0, 1, 'V'), 1.5)]

>>> list(((item[0][2], item[1]) for item in score.iteritems() if item[0][:2] == (0, 1)))
[('NP', 1.2), ('V', 1.5)]

>>> [k[2] for k in score if k[:2] == (0, 1)]
['NP', 'V']
于 2012-05-11T06:51:59.853 回答
1

我的智商超过 200,所以我希望这很重要:

score = {}
score[(0, 1, 'N')] = 1.0
score[(0, 1, 'V')] = 1.5
score[(0, 1, 'NP')] = 1.2
score[(1, 2, 'N')] = 0.2
score[(1, 2, 'PP')] = 0.1
score[(1, 2, 'V')] = 0.1

from itertools import groupby

def group_key(dict_key):
    return dict_key[:2]

sorted_keys = sorted(score)
for group_key, group_of_dict_keys in groupby(sorted_keys, key=group_key):
    print group_key
    print [(dict_key, score[dict_key]) for dict_key in group_of_dict_keys]

"""
(0, 1)
[((0, 1, 'N'), 1.0), ((0, 1, 'NP'), 1.2), ((0, 1, 'V'), 1.5)]
(1, 2)
[((1, 2, 'N'), 0.2), ((1, 2, 'PP'), 0.1), ((1, 2, 'V'), 0.1)]
"""

当然,如果您只想要标签本身,请更改循环:

for group_key, group_of_dict_keys in groupby(sorted_keys, key=group_key):
    print group_key
    tags = [tag for x, y, tag in group_of_dict_keys]
    print tags
"""
(0, 1)
['N', 'NP', 'V']
(1, 2)
['N', 'PP', 'V']
"""
于 2012-05-11T07:11:19.393 回答
0

如果您只想要标签,那么 defaultdict 将是最简单的选择。

score = {}
score[(0, 1, 'N')] = 1.0
score[(0, 1, 'V')] = 1.5
score[(0, 1, 'NP')] = 1.2
score[(1, 2, 'N')] = 0.2
score[(1, 2, 'PP')] = 0.1
score[(1, 2, 'V')] = 0.1

from collections import defaultdict

dict_ = defaultdict(list)

for x,y,tag in score:
    dict_[x,y].append(tag)

#now get a result for any x,y we like:
print dict_[0,1]
"""['NP', 'N', 'V']"""
于 2012-05-11T07:17:41.650 回答