如何管理同一数据的多个索引?

时间:2014-10-14 12:41:21

标签: python dictionary indexing

我正在编写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

这是要走的路吗?每次获得新数据时我都必须这样做。会有很多数据,我不想重新构建一个“视图”,而不是另一个。我只是在寻找其他想法。感谢。

1 个答案:

答案 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, ...)等访问它,然后您可以随时更改数据存储机制。

如果您自己写下来,我会下注,当您意识到自己意外搞砸了数据时,如果从某个索引中删除了某些内容数据存储或其他什么,你还记得为什么在存储和索引数据时数据库是你最好的朋友:)