如何存储一对一关系 table 以便在 Python 中快速查找?
How to store a one-to-one relationship table for fast lookups in Python?
table的每两列之间存在一对一的关系,比如Ci <--> Cj
。
如何存储这样的 table 以便快速查找?我将使用以下代码片段清楚地表达自己。
C1 = [1, 2, 3, 4]
C2 = ['a', 'b', 'c', 'd']
C3 = ['one', 'two', 'three', 'four']
# lookup, Ci --> Cj
idx = Ci.index(val)
corresponding_val = Cj[idx]
Dict 是个不错的选择。以只有两列的 table 为例,将 table 存储为字典,例如 d[C1] = C2
。从 C1
到 C2
需要 O(1)
。但是从C2
到C1
,时间会长一些。
如果您需要快速查找 C1、C2、C3 中的任何一个键,那么三个字典。每个的值是一个三元组。
all = zip( C1, C2, C3)
d1,d2,d3 = {},{},{}
for v in all:
d1[ v[0]], d2[v[1]], d3[v[2]] = v,v,v
用法:
>>> d3['three']
(3, 'c', 'three')
>>> d1[1]
(1, 'a', 'one')
>>> d2['a']
(1, 'a', 'one')
这是仅访问一组元组数据的三个索引,因此它的效率与假设您每次快速查找都需要一个哈希索引一样高效。
assert d1[1] is d2['a'] and d1[1] is d3['one']
每一列只需要一个dict,因为访问的是整行。但是,假设任何列中都没有重复值。如果可能存在重复项,那么每个检索到的值都需要是一个行元组列表,而不仅仅是唯一的一个行元组。如果你需要这个,设置起来并不难:
C2=['odd','even','odd','even']
...
for v in all:
d1.setdefault(v[0],[]).append(v)
d2.setdefault(v[1],[]).append(v)
d3.setdefault(v[2],[]).append(v)
>>> d2
{'even': [(2, 'even', 'two'), (4, 'even', 'four')], 'odd': [(1, 'odd', 'one'), (3, 'odd', 'three')]}
如何压缩唯一列表中的所有列。种类:
D = zip(C1, C2, C3,...)
通过这种方式,您可以使用综合列表遍历 D 的第一个元素和 returns 您需要的其他元素。
table的每两列之间存在一对一的关系,比如Ci <--> Cj
。
如何存储这样的 table 以便快速查找?我将使用以下代码片段清楚地表达自己。
C1 = [1, 2, 3, 4]
C2 = ['a', 'b', 'c', 'd']
C3 = ['one', 'two', 'three', 'four']
# lookup, Ci --> Cj
idx = Ci.index(val)
corresponding_val = Cj[idx]
Dict 是个不错的选择。以只有两列的 table 为例,将 table 存储为字典,例如 d[C1] = C2
。从 C1
到 C2
需要 O(1)
。但是从C2
到C1
,时间会长一些。
如果您需要快速查找 C1、C2、C3 中的任何一个键,那么三个字典。每个的值是一个三元组。
all = zip( C1, C2, C3)
d1,d2,d3 = {},{},{}
for v in all:
d1[ v[0]], d2[v[1]], d3[v[2]] = v,v,v
用法:
>>> d3['three']
(3, 'c', 'three')
>>> d1[1]
(1, 'a', 'one')
>>> d2['a']
(1, 'a', 'one')
这是仅访问一组元组数据的三个索引,因此它的效率与假设您每次快速查找都需要一个哈希索引一样高效。
assert d1[1] is d2['a'] and d1[1] is d3['one']
每一列只需要一个dict,因为访问的是整行。但是,假设任何列中都没有重复值。如果可能存在重复项,那么每个检索到的值都需要是一个行元组列表,而不仅仅是唯一的一个行元组。如果你需要这个,设置起来并不难:
C2=['odd','even','odd','even']
...
for v in all:
d1.setdefault(v[0],[]).append(v)
d2.setdefault(v[1],[]).append(v)
d3.setdefault(v[2],[]).append(v)
>>> d2
{'even': [(2, 'even', 'two'), (4, 'even', 'four')], 'odd': [(1, 'odd', 'one'), (3, 'odd', 'three')]}
如何压缩唯一列表中的所有列。种类:
D = zip(C1, C2, C3,...)
通过这种方式,您可以使用综合列表遍历 D 的第一个元素和 returns 您需要的其他元素。