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 に答える
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 に答える