Python天才如何迭代Python元组中的单个值?

时间:2012-05-11 06:50:44

标签: python tuples loops

我有一个名为'得分'使用键是元组。 每个元组的形式为(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天才都知道如何做到这一点?我在这个上寻找多种选择。感谢。

5 个答案:

答案 0 :(得分:8)

[tag for x,y,tag in score if x==0 and y==1]

答案 1 :(得分:7)

列表理解怎么样:

[ x[2] for x in score.keys() if x[0:2] == (0,1)]

答案 2 :(得分: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']

答案 3 :(得分: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']
"""

答案 4 :(得分: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']"""