我正在编写python代码,我有一些需要以多种方式访问的数据。 我无法发布确切的例子,但这里是模拟的。所以在伪代码中,我有一个:
int floorid # which factory floor
int robotid # which robot arm on the floor
int partnum # what part is being mfg'ed.
[...] # other sorts of data regarding statistics.
此数据将定期发布。在任何时候,floorid / robotid都可以成为一个组成部分。而且任何时候都只制造一个部件。根据用户的不同,他们可能希望通过floorid / robotid(比如维护工作者)或partnum(可能是部件经理)自然地索引它。
问题是,提供相同数据的多个视图的最佳方法是什么?我以为我可以制作两个指向相同数据的词典。像
这样的东西floorid = datum.floorid
robotid = datum.robotid
partnum = datum.partnum
maintenance[floorid][robotid] = datum
supplychain[partnum] = datum
这是要走的路吗?每次获得新数据时我都必须这样做。会有很多数据,我不想重新构建一个“视图”,而不是另一个。我只是在寻找其他想法。感谢。
答案 0 :(得分:1)
正如@ Martijn-Pieters已在评论中指出,这听起来很像数据库的工作。您可以在python中非常简单地运行sqlite3,并将数据保存在单个文件中,或者如果您不在乎丢失它,请将其保存在内存中。
话虽如此,如果您想在python中执行此操作,您可能会执行以下操作:
import collections
raw_data = []
idx_maintenance = collections.defaultdict(set)
idx_supplychain = collections.defaultdict(set)
Datum = collections.namedtuple('Datum', 'floorid robotid partnum')
def add_data(floorid, robotid, partnum):
datum = Datum(floorid, robotid, partnum)
raw_data.append(datum)
idx_maintenance[(floorid, robotid)].add(datum)
idx_supplychain[partnum].add(datum)
# whatever other indexes you need
# so you can add stuff
add_data(1, 1, 1)
add_data(1, 1, 2)
add_data(1, 1, 3)
add_data(1, 2, 1)
# then you can use the indexes to do lookups
set_of_data = idx_maintenance[(1, 1)]
这假设您可以为每个(floorid,robotid)等设置多个partnums。
老实说。你真的听起来像是想要一个数据库。
现在使用sqlite3:
的示例import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute('''CREATE TABLE datum (floorid int, robotid int, partnum int)''')
conn.commit()
c = conn.cursor()
new_data = [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1)]
c.executemany('INSERT INTO datum VALUES (?,?,?)', new_data)
conn.commit()
# exercise for the reader - add indexes
c = conn.cursor()
for row in c.execute('SELECT * FROM datum WHERE floorid=? and robotid=?', (1, 1)):
print(row)
不要告诉建筑师那里隐藏着一个数据库。他们永远不会知道差异:)
无论哪种方式,将类/模块中的详细信息包装在站点外,并使用mydatastore.add_record(whatever)
,mydatastore.records_matching(robotid=1, ...)
等访问它,然后您可以随时更改数据存储机制。
如果您自己写下来,我会下注,当您意识到自己意外搞砸了数据时,如果从某个索引中删除了某些内容数据存储或其他什么,你还记得为什么在存储和索引数据时数据库是你最好的朋友:)