2014-03-14 3 views
2

Это мой первый вопрос о stackoverflow, и я полный новичок на Python - пожалуйста, несите меня. Определенно много пробовал найти решение в Интернете - возможно, не использовал правильные условия поиска?Как автоматически увеличить значение для определения постоянного списка индексов в Python?

Чтобы символически адресовать записи в массиве, я хотел бы определить список индексов, например.

USRNM_IDX = 0 
TIMSTP_IDX = 1 
MSISDN_IDX = 2 

Иногда мне может понадобиться, чтобы применить изменения в список: изменить порядок, вставлять новые или удалять существующие значения:

USRNM_IDX = 0 
AMNT_IDX = 1 
TIMSTP_IDX = 2 
MSISDN_IDX = 3 

и нужно будет вручную изменить показатели остаются правильными - утомительно и error- склонный. Там определенно будет лучший способ сделать это. Самое лучшее, что я мог бы до сих пор придумать:

run_idx = 0 
USRNM_IDX = run_idx; run_idx += 1 
TIMSTP_IDX = run_idx; run_idx += 1  
MSISDN_IDX = run_idx; run_idx += 1  
AMNT_IDX = run_idx; run_idx += 1 

Не совсем красиво, я бы сказал. Может быть, для этого существует совершенно другая идиома в Python, о которой я еще не знаю? Спасибо заранее за вашу помощь.


Большое спасибо уже - угадайте, что вы правы в проблеме XY. Вот «больший вопрос».

Программа Python обрабатывает некоторый файл журнала и сохраняет информацию в словаре. Каждая запись в словаре сама будет массивом. Теперь я хочу индексировать этот массив «символически», например.

trkey_dict[trkey][MSISDN_IDX] = this_msisdn 
trkey_dict[trkey][CARRIER_IDX] = this_carrier 
trkey_dict[trkey][TIMSTP_IDX] = this_timestamp 

Если я правильно узнал, массивы могут быть решены только целыми числами, - так что я ищу умный способ создания некоторые переменные (может быть постоянным - но увы ...) с осмысленными именами, чтобы не использовать литеральные значения при доступе к элементам массива. Это также позволит мне, чтобы изменить расположение массива очень легко для того, чтобы, наконец, выход в правильном порядке для моего списка результатов, например:

for trkey in trkey_dict.keys(): print trkey,";"," ; ".join(trkey_dict[trkey]) 

В настоящее время я пытаюсь лучше понять все другие агрегированные типы данных , что Python предоставляет: кортежи, наборы и т. д. - не уверен, если некоторые из них могут обеспечить лучшее решение.


Ответ дается DonCallisto бы создание списка индексов очень приятно. Мне даже не нужно было бы использовать insert, так как список индексов не будет изменяться динамически. Таким образом,

mylist = ['USRNM_IDX', 'TIMSTP_IDX', 'MSISDN_IDX'] 

действительно будет хорошо. Однако при обращении к элементам массива всегда необходимо использовать

mylist.index('USRNM_IDX') 

и, следовательно, результат, например, в

trkey_dict[trkey][mylist.index('MSISDN_IDX')] = this_msisdn 
trkey_dict[trkey][mylist.index('CARRIER_IDX')] = this_carrier 
trkey_dict[trkey][mylist.index('TIMSTP_IDX')] = this_timestamp 

, который не выглядит действительно симпатичным для меня, а затем снова.

Большое спасибо всем, кто комментирует и отвечает. Будет обновляться, как я узнаю больше.

+0

"symbollically записи адреса" означает '' dict' не list' –

+1

Да, я согласен с @ behzad.nouri. Это пахнет проблемой [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Какой у вас большой вопрос? –

ответ

2

Почему вы не используете список и используете операцию на основе списка?

Как

mylist = ['USRNM_IDX', 'TIMSTP_IDX', 'MSISDN_IDX'] 
mylist.insert(1, 'AMNT_IDX') 

Если вам нужно значение (так индекс) можно использовать

mylist.index('TIMSTP_IDX') 
+0

Обратите внимание, что вы можете легко получить доступ, например. 'для индекса, значение в перечислении (mylist)' при необходимости – jonrsharpe

+0

И найдите имя с помощью 'mylist.index ('USRNM_IDX')'. –

+0

Да, ребята, я был за телефоном и редактировал вопрос :) – DonCallisto