在一个元组列表中找到一个元素,并给出相应的元组。

问题描述 投票:0回答:1

我想在I2C扫描仪中实现一个简单的查找功能。我的I2C扫描器以十六进制地址的形式输出一个找到的设备列表,例如['0x3c', '0x48']我的想法是使用一个元组列表 knownDevices = [(address1, Description1), (address2, Description2)] 我是python的初学者,所以我有点卡住了。我知道如何在一个 "普通 "列表中用以下方法查找一个单一的值 if 'x' in 'list'但如果设备更多,这将是非常笨重的。我想在我的设备列表中进行迭代,当与我的 "数据库 "匹配时,它应该打印出类似以下的内容 'found <description1> at address <address1>'

python list search sensors
1个回答
1
投票

让Python为你做这项工作,并将地址映射到字典中的描述。

desc = {"0xaa": "Proximity 1", "0xbb": "Motion 1"} # And so on
# If you really want a function that does the job (not necessary) then:
get_description = desc.get # Maximize the access speed to the dict.get() method
# The method get works as follows:
desc.get("0xaa", "Unknown device")
# Or you can call it as:
get_description("0xbb", "Unknown device")
# The method gives you the possibility to return the default value in case the key is not in the dictionary
# See help(dict.get)
# But, what you would usually do is:
desc["0xaa"] # Raises an KeyError() if the key is not found
# If you really need a function that returns a list of addr, desc tuples, then you would do:
def sensors ():
    return [(x, get_description(x, "Unknown device") for x in get_addresses()]

# Which is short and efficient for:
def sensors ():
    sensors_list = []
    for x in get_addresses():
        tpl = (x, get_description(x, "Unknown device"))
        sensors_list.append(tpl)
    return sensors_list

从字典中获取一个值是非常快速和有效的.你不应该有时间或内存问题.有许多不同的方法可以加快使用索引而不是dict()的速度,但相信我,如果你不是很受内存和速度的限制,它不值得花时间和编码来获得它的权利.这种方法将包括,例如,使I2C地址以这样的顺序,你的算法可以将它们缩小到包含相应描述的元组()的索引。这取决于你对I2C设备的地址有多少控制权。简而言之,你将建立一个查找表,并以类似三角函数的方式使用它。对于一个简单的任务来说,这是一个很大的工作。我看了一下你所使用的MPython和MCU,你绝对有足够的资源来使用标准的、Pythonic的方式来完成你的任务,那就是:字典。

另外,我必须解释一下,在例子函数get_addresses()下,我指的是一个检测当时存在的设备的函数。所以,如果你因为某些原因需要一个元组的列表,而你的设备总是存在,你可以只做。

list(desc.items())

所得到的列表会和我的sensor()函数一样 但它总是会返回所有的设备,不管它们是否存在。另外,如果你在这段时间内添加了一个新的设备,它不在字典中,它不会作为 "未知设备 "出现在结果列表中。

你还应该知道的是dict()的数据类型,出于优化的原因是无序的。这意味着list(desc. items())不会按照你在dict()中输入的顺序返回你的设备的元组。但是我的sensor()函数会按照想象中的get_addresses()函数返回设备地址的顺序来返回它们。

例如,如果你想按照描述的字母顺序显示所有可能的设备,你可以这样做。

srtkey = lambda item: item[1]
for address, description in sorted(desc.items(), key=srtkey):
    print("'%s' @ address %s" % (description, address))
    # Of course, you would use the function and/or the algorithm  you use to display the string line

请看一下help(dict.items), help(sorted)和help("lambda")来理解这段代码的工作原理.

© www.soinside.com 2019 - 2024. All rights reserved.