Вы не указываете, является ли типично отсортированные данные, которые вы предоставляете, или же тот же ключ может перемежаться с другими ключами по всему файлу, и это имеет принципиальное значение для алгоритма.Из вашего примера кода я делаю вывод, что они будут отображаться в произвольном порядке.
Также вы не говорите, для чего вы собираетесь извлекать данные таким образом.Это может иметь большое значение - существует много разных способов хранения данных, и приложение может быть важной функцией при определении времени доступа.Поэтому вы можете рассмотреть возможность использования различных типов хранилищ.Не зная, как вы предлагаете использовать результирующую структуру, следующее предложение может быть неуместным.
Поскольку данные представляют собой числа с плавающей запятой, вы можете рассмотреть возможность использования модуля полки для поддержания простотысписки чисел с плавающей запятой, набранных по буквам.Преимущество этого заключается в том, что все травление и извлечение из внешнего хранилища обрабатываются автоматически.Если вам нужно увеличить скорость, рассмотрите возможность использования более эффективного протокола травления (один из неиспользованных аргументов для shelve.open()
).
# Transform the data:
# note it's actually more efficient to process line-by-line
# as you read it from a file - obviously it's best to try
# to avoid reading the whole data set into memory at once.
data = """\
A ... 23.4421
A ... -23.442
A ... 76.2224
B ... 32.1232
B ... -23.001
C ... 652.123"""
data = [(k, float(v))
for (k, _, v) in
[_.split() for _ in data.splitlines()]]
# create a shelve
import shelve
shelf = shelve.open("myshelf", "c")
# process data
for (k, v) in data:
if k in shelf:
# see note below for rationale
tmp = shelf[k]
tmp.append(v)
shelf[k] = tmp
else:
shelf[k] = [v]
# verify results
for k in shelf.keys():
print k, shelf[k]
Возможно, вы удивляетесь, почему я не использовал shelf[k].append(v)
вслучай, когда ключ уже был замечен.Это потому, что только операция назначения клавиш запускает обнаружение изменения значения.Вы можете прочитать документы модуля shelve для получения более подробной информации и узнать, как использовать двоичный формат pickle.
Обратите также внимание, что эта программа заново создает полку при каждом запуске из-за аргумента "c"до shelve.open()
.