3

私は1000を超えるキーを持つ巨大な辞書を持っており、各値の長さは600000intを超えています。ここで、これらの整数のいくつかを抽出する必要があるので、600000から5kとしましょう。ただし、ランダムな5kにすることはできず、非常に特定の位置に配置する必要があります。5kはまだ少し大きすぎて手作業で抽出できないため、値のどの整数を取り出す必要があるかを示すインデックスのリストを使用する必要があります。インデックス[1,3,5,7,9]とlong_val['a'、'b'、'c'、'd'、'e'、'f'、'gを使用して、小さなリストで抽出をテストしました'、' h'、' i'、' j'、' k']それなら、私はそれを行うことができます:

for each in xrange(len(long_val)):
    print indices[long_val[each]]

そして、b、d、f、h、jを取得します(必要に応じて)。

さて、辞書(long_val)が実際の辞書値に置き換えられる場合、それはそれほど単純ではありません。私はそれを試しました:

for keys,values in dict_gtps.iteritems():
    for each in xrange(len(values)):
        abs_new[keys]=pos_3[values[each]]

しかし、「インデックスが範囲外です」というエラーメッセージが表示されます。

4

3 に答える 3

5

同じインデックスを使用している場合は、より効率的に使用できますitemgetter(*indices)

>>> from operator import itemgetter
>>> indices =  [1,3,5,7,9]
>>> long_val = ['a','b','c','d','e','f','g','h','i','j','k'] 
>>> ig = itemgetter(*indices)
>>> ig(long_val)
('b', 'd', 'f', 'h', 'j')

それで

from operator import itemgetter
ig = itemgetter(*indices)
for k, v in dict_gtps.iteritems():
    print ig(v)
    abs_new[k] = ig(v)

dictの理解を使用することもできます

abs_new = {k:ig(v) for k,v in dict_gtps.iteritems()}
于 2012-10-10T14:39:08.297 に答える
3

私があなたの要件を正しく読んだと仮定すると、あなたは試すことができます:

for key, value in dict_gtps.iteritems():
  abs_new[key] = [value[i] for i in indices]
于 2012-10-10T14:39:52.587 に答える
1

サンプルコードに欠陥があり、indexesとlong_valの値が逆になっています。

 indices = [1,3,5,7,9]
 long_val = ['a','b','c','d','e','f','g','h','i','j','k']
 for each in xrange(len(long_val)):
    print indices[long_val[each]]

をスローしTypeErrorます。そのはず:

indices = [1,3,5,7,9]
long_val = ['a','b','c','d','e','f','g','h','i','j','k']
for each in xrange(len(indices)):
    print long_val[indices[each]] 

これに基づいて、辞書関数が範囲エラーをスローする理由はかなり明白です。間違った変数をフィードしています。コードを自分で修正してみてください。

/後世のために編集また、インデックスの値は整数であるため、実際にはxrange--を使用する必要はありません。

for i in indices:
    print long_val[i]

はるかに簡単です。

于 2012-10-10T14:45:14.657 に答える