根据包含的值从元组集合中获取元组

0 投票
3 回答
792 浏览
提问于 2025-04-15 12:30

我有一个数据结构,它是一些元组的集合,像这样:

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

其中第一个和第三个元素在这个集合中都是独一无二的。

我想做的是通过第三个值来获取一个特定的元组,比如:

>>> my_thing = things.get( value(3) == "Blurgle" )
(154, 33, "Blurgle")

总得有比一个一个检查值更好的方法吧!

3 个回答

1

如果你需要多次进行这种搜索,为什么不一次性把东西转换成 things_dict 呢?这样之后搜索起来会更简单、更快。

things = ( (123, 1, "Floogle"), (154, 33, "Blurgle"), (156, 55, "Blarg") )

things_dict = {}
for t in things:
    things_dict[t[2]] = t

print things_dict['Blarg']
4

如果你的外层结构是一个元组,那么循环(或者类似的列表推导式、生成器表达式)几乎是唯一的选择。元组的设计就是为了轻量级,它几乎没有什么方法可用(只有一些特殊的方法来实现索引、循环等功能)。

字典的快速查找是它的特点,而元组则不是。你能不能用字典作为主要结构,或者作为辅助结构,把“第三个元素的值”映射到你想要的子元组(或者它在主元组中的索引)呢?这可以通过一个循环来构建,然后你就可以快速查找任意多的结果!

如果你选择使用循环,像Brian评论中提到的生成器表达式比列表推导式更易读,平均速度也可能快一倍,因为它只需要进行一半的循环:

my_thing = next(item for item in things if item[2] == "Blurgle")

这段代码的意思是“在那些第二个子项等于Blurgle的东西中,找到下一个项目”。因为你是从头开始找的,所以你找到的“下一个”项目就是“第一个”符合条件的项目(在你的情况下,可能也是唯一一个)。

如果你需要处理没有项目符合条件的情况,你可以给next传递一个第二个参数(如果需要,它会返回这个参数),否则(像我代码片段中那样没有第二个参数)如果没有项目符合条件,你会得到一个StopIteration异常——这两种行为都可能是你想要的(因为你说这种情况不应该发生,所以异常对于你的应用来说是合适的,因为这种情况会被视为意外错误)。

1

如果things是一个列表,并且你知道第三个元素是唯一的,那用列表推导式怎么样呢?

>> my_thing = [x for x in things if x[2]=="Blurgle"][0]

虽然在背后,我猜这个方法会检查所有的值,逐个对比。如果你不喜欢这样,那你可以考虑把my_things改成一个dict(字典),然后用第一个值或者第三个值作为键来使用。

撰写回答