我有一个框架列表> 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)
中是否已存在ifilter
和webtable
来源的组合。实现此目的的最佳数据结构是什么?
答案 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":
....