首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中使用查找表

在Python中使用查找表
EN

Stack Overflow用户
提问于 2018-05-24 19:29:58
回答 3查看 51.3K关注 0票数 4

我正在使用python自动化一个压电液滴发生器。对于脉冲长度的每一个值,都会有一个合适的电压值,以产生一个信号来释放一个液滴。此电压值在每次运行时都会不断变化(例如,+或-10)。所以我有一个数据库,里面有每个脉冲长度的不同电压值。

我想知道一些关于在python中使用查找表的事情。对于我的任务,我希望选择一个从15到70的随机脉冲长度,并将该值与数据库中的特定电压范围相关联(例如:对于值17,我希望程序访问查找表并返回电压范围35-50)。有没有可能取整个范围而不只是单个值。因为我刚接触编码和python,所以我不是很确定。欢迎任何帮助。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-24 19:47:07

由于我们没有得到任何关于应该将哪些范围与哪些值相关联的进一步信息,我假设您会将我的答案转给您自己的问题。

在python中,查找表被称为dictionary。它们由大括号表示。

简单的例子:

代码语言:javascript
复制
myDict = {1: [1, 2, 3, 4, 5],
          2: [2, 3, 4, 5, 6],
          3: [3, 4, 5, 6, 7]}

在这里,您创建了一个包含三个条目的字典: 1、2、3。每个条目都有一个与之相关联的范围。在这个例子中,它是逻辑range(i, i+5)

你可以像查询列表一样查询你的“查找表”:

代码语言:javascript
复制
print(myDict[2])
>>> [2, 3, 4, 5, 6]

(请注意,[2]不是索引#2,而实际上是您要查找的值2 )

通常,您不希望手动创建字典,而是希望自动构建它。例如,通过结合使用dictzip,您可以将两个相同长度的列表合并到一个字典中

代码语言:javascript
复制
indices = range(15, 76) # your values from 15 to 75
i_ranges = [range(i, i+5) for i in indices] # this constructs your ranges
myDict = dict(zip(indices, i_ranges)) # zip together the lists and make a dict from it
print(myDict[20])
>>> [20, 21, 22, 23, 24]

顺便说一句,您并不局限于整数和列表。你也可以这样做:

代码语言:javascript
复制
myFruits = {'apples': 20, 'cherries': 50, 'bananas': 23}
print(myFruits['cherries'])
>>> 50
票数 12
EN

Stack Overflow用户

发布于 2018-05-24 19:52:37

如果你能把你的数据库放在一个大的数组中(如果你的数据库不是太大),numpy就是你的选择。

下面是一个简单的例子:

代码语言:javascript
复制
import numpy

my_array = numpy.zeros([3, 8], dtype=numpy.uint8)

这将输出以下数组:

代码语言:javascript
复制
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
   [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

在那里,您可以使用以下代码行访问该数组:

代码语言:javascript
复制
my_array[0]

它将输出第一行:

代码语言:javascript
复制
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

您可以对列执行相同的操作:

代码语言:javascript
复制
my_array[:, 0]

它将输出第一列:

代码语言:javascript
复制
array([ 0.,  0.,  0.])

使用字典也是一个很好的方法。

然而,numpy是用C语言编写的,比python集成函数要快得多。它提供了许多有用的功能,如均值、标准差,其中(检查数组中的值存在的位置)

您还可以使用numpy创建更复杂的数组,并轻松地探索它们

票数 2
EN

Stack Overflow用户

发布于 2019-06-17 18:52:02

下面是一个线性插值查找实现:

代码语言:javascript
复制
from bisect import bisect_left

def lookup(x, xs, ys):
    if x <= xs[0]:  return ys[0]
    if x >= xs[-1]: return ys[-1]

    i = bisect_left(xs, x)
    k = (x - xs[i-1])/(xs[i] - xs[i-1])
    y = k*(ys[i]-ys[i-1]) + ys[i-1]

    return y

用于测试:

代码语言:javascript
复制
xs = [1, 2, 4, 8, 16, 32, 64, 128, 256]
ys = [0, 1, 2, 3, 4, 5, 6, 7, 8]
i_xs = [i/1000-500 for i in range(1000000)]

start_time = time.time()
ys = [lookup(x, xs, ys) for x in i_xs]
print("%s secs" % (time.time() - start_time))

我大概有1.8秒的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50508262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档