python - 如何在Python中存储一对一关系表以便快速查找?

标签 python lookup one-to-one

表的每两列之间存在一对一的关系,例如Ci <--> Cj

如何存储这样的表以进行快速查找?我将用下面的代码片段清楚地表达自己的意思。

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]

字典是一个不错的选择。以一个只有两列的表为例,将表存储为字典,比如 d[C1] = C2 。需要O(1)来自C1C2 。但来自C2C1 ,需要更长的时间。

最佳答案

如果您需要快速查找 C1、C2、C3 中任何一个中的键,则需要三个字典。每个值都是一个 3 元组。

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']   

每一列只需要一个字典,因为访问的是整行。但是,假设任何列中都没有重复值。如果可能存在重复项,则每个检索到的值需要是行元组的列表,而不仅仅是唯一的行元组。如果您需要这个,设置起来并不困难:

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')]}    

关于python - 如何在Python中存储一对一关系表以便快速查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37032977/

相关文章:

python - 虽然循环在 Python 中无法正常工作

python - ndb.DateTimeProperty 上的 Query.order 未按正确顺序返回结果

MongoDB Lookup 仅当没有数据时返回空数组

java - 一对一实体映射删除操作不起作用

java - Hibernate 中的一对一共享主键映射可以是可选/空吗?

python - Pandas to_csv 不输出文件

python - 读取列的所有行并检查分隔符,如果找到,则在 Python 中使用该数据创建列(需要 4 列)

java - 从独立 Java 应用程序访问 Glassfish 上的安全 EJB

hadoop - Hive - 如何查询表以获取其自己的名称?

json - 如何使用 @JsonManagedReference 和 @JsonBackReference 映射 POJO 之间的 OneToOne 关系