2012-10-10 4 views
3

У меня есть огромный словарь с более чем 1000 ключами и каждое значение более 600 000 int long. Теперь мне нужно извлечь некоторые из этих целых чисел, поэтому с 600 000 я хочу сказать, что 5k. Но это не может быть случайным 5k, они должны быть на очень определенных позициях. Из-за того, что 5k все еще слишком велико, чтобы извлечь его вручную, мне нужно использовать список индексов, который укажет, какие целые числа в этом значении должны быть выведены. Я проверил извлечение на небольших списках с индексами [1,3,5,7,9] и long_val ['a', 'b', 'c', 'd', 'e', ​​'f', ' г», 'ч', 'я', 'J', 'K'], то можно сделать это:Редактирование значений в словаре python

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]] 

Но я получаю сообщение об ошибке «Index out the range».

ответ

3

Предполагая, что Я правильно прочитал ваши требования, вы можете попробовать:

for key, value in dict_gtps.iteritems(): 
    abs_new[key] = [value[i] for i in indices] 
+0

Легко и полезно !!! Спасибо!! – branwen85

+0

Добро пожаловать. –

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()} 
+0

Полезно, спасибо! – branwen85

+0

Ooo .. +1 для варианта понимания dict. –

+0

Itemgetter немного менее полезен, чем понимание списков, поскольку оно ставит новые значения в кортеж, и я предпочитаю иметь их в списках. – branwen85

1

Ваш примерный код имеет недостатки, индексы и 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]] 

throws a 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] 

Намного проще.

+0

Спасибо! Я фактически назвал переменные a и b, а затем перепутал, что было ... – branwen85

+0

@ user1735184 Я добавил упрощение вашей оригинальной функции. Возможно, вы захотите повторить это в своем конечном коде. – kreativitea

Смежные вопросы