лучшая структура данных, которую я могу использовать для хранения табличных данных? - PullRequest
0 голосов
/ 30 января 2012

У меня есть список кадров> 10000 и список источников (координаты), я хочу найти, какой источник существует в каком кадре.Каждый кадр имеет атрибут фильтра, и ожидается, что источник может быть найден в одном или нескольких кадрах одного и того же фильтра.Если это так, я хочу записать только один случай такого события.

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

Source | filter_1 |filter_2 |filter_3 |filter_4 |
-------------------------------------------------
1      | image1   | image 2 | image 3 | image 4 |
2      | image5   | image 6 | image 7 | image 8 |

это мой код

webtable =[]
for frame in frames:
  for x, y in sources:
    if x_y_on_frame():
       webtable.append(
       {
       'source':(x,y), 
       'ifilter':frame.filter.name, 
       'ifile':frame.filename,
       'pFile':frame.pngfile,
       'fFile':frame.fitsfile,
       }
       )

Мне нужно проверить, есть ли комбинация источника, например (x,y) и ifilter уже существует в webtable, прежде чем я добавлю запись.Какова лучшая структура данных для реализации этого?

Ответы [ 3 ]

1 голос
/ 30 января 2012

Мне нужно проверить, существует ли комбинация источника, т. Е. (X, y) и ifilter, уже в веб-таблице, прежде чем я добавлю запись.Какова лучшая структура данных для реализации этого?

Если предположить, что x, y и ifilter могут быть представлены в виде строк или целых чисел (или других неизменяемых типов), на самом деле было бы еще проще простохранить вашу информацию в словаре, где ключом является кортеж (x, y, ifilter), для этого потребуется минимальное количество кода, и при этом он будет очень эффективным:

webtable ={}
for frame in frames:
  for x, y in sources:
    if x_y_on_frame():
        keyTuple = (x,y,frame.filter.name)
        if not keyTuple in webtable:
            webtable[keyTuple] = {
            'ifile':frame.filename,
            'pFile':frame.pngfile,
            'fFile':frame.fitsfile,
            }
0 голосов
/ 31 января 2012

Поскольку у вас есть статический набор ключей для ваших словарей данных, namedtuple из модуля collections на самом деле будет лучше, чем анонимный словарь. Именованные кортежи имеют меньшие накладные расходы, чем словари (поскольку дублирующиеся ключи не нужно хранить для каждого элемента), но имеют удобство именованного доступа.

Вы можете определить свой именованный кортеж как:

from collections import namedtuple
Row = namedtuple('Row', 'iFile pFile fFile')

Тогда, скорее, создаем словарь вида:

{ 'iFile': foo, 'pFile': bar, ...}

вы бы создали экземпляр вашего именованного кортежа, который вы вернули из фабрики:

Row(iFile=foo, pFile=bar, ...)

Если вам нужен доступ к вложенному значению, вы просто получаете доступ к нему как к переменной экземпляра:

foo = Row(iFile="somevalue", pfile="different_value", fFile="yet another value")
if foo.iFile == "whatever":
   ....
0 голосов
/ 30 января 2012

Python dict было бы просто отлично.Если есть запись с указанным ifilter, x и y - переходите к следующему пункту в источниках:

webtable = []
webtable_cache = {}

for frame in frames:
  for x, y in sources:
    if x_y_on_frame():

        ifilter = frame.filter.name

        if ifilter in webtable_cache
           if y in webtable_cache[ifilter]:
                if x in webtable_cache[ifilter][y]:
                    continue     # already in webtable
                else:
                    webtable_cache[ifilter][y][x] = True
            else:
                webtable_cache[ifilter][y] = {x: True}
        else:
            webtable_cache[ifilter] = {y: {x: True}}

        webtable.append(
               {
               'source':(x,y), 
               'ifilter':ifilter, 
               'ifile':frame.filename,
               'pFile':frame.pngfile,
               'fFile':frame.fitsfile,
               }
           )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...