我可以用来存储表格数据的最佳数据结构?

时间:2012-01-30 16:22:52

标签: python data-structures

我有一个框架列表> 10,000和一个源列表(坐标),我想找到哪个源存在于哪个帧上。每个帧都有一个filter属性,并且可以在同一个过滤器的一个或多个帧上找到源。是这种情况,我想只记录这种事件的一次发生。

最终轻松运行脚本以生成Web表。下面是我想要生成的表的示例。

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)中是否已存在ifilterwebtable来源的组合。实现此目的的最佳数据结构是什么?

3 个答案:

答案 0 :(得分:1)

  

我需要检查源的组合,即(x,y)和ifilter   在我附加记录之前,已存在于webtable中。哪个最好   数据结构实现这个?

假设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,
            }

答案 1 :(得分:0)

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,
               }
           )

答案 2 :(得分:0)

由于您的数据字典有一组静态密钥,namedtuple模块中的collections实际上会优于匿名字典。 Namedtuples的开销低于字典(因为每个项目不必存储重复的键),但具有命名访问的便利性。

您可以将您的namedtuple定义为:

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

然后,而是创建一个表单字典:

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

您将创建一个从工厂函数返回的namedtuple的实例:

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

如果您需要访问附加值,只需将其作为实例变量访问:

foo = Row(iFile="somevalue", pfile="different_value", fFile="yet another value")
if foo.iFile == "whatever":
   ....