返回密钥匹配值 - 添加约束

时间:2012-03-20 12:24:22

标签: python dictionary

首先根据值搜索Python字典,以获得关键输出对我有意义。但是如果我们想在搜索中添加另一个约束呢?

例如,我在这里搜索最低值的字典(多维),然后返回该最低值的键:

minValue[id] = min(data[id].items(), key=lambda x: x[1])

由于此方法只返回一个与该值匹配的键,而可能有多个,我想添加另一个约束。

是否有一种优雅的添加方式:返回键包含总体最小值并且具有最长匹配的长度?

2 个答案:

答案 0 :(得分:1)

好吧,您可以将长度添加到关键功能:

>>> data = {'a': 1, 'aa': 1, 'b': 2, 'c': 3}
>>> min(data.items(), key=lambda x: x[1])
('a', 1)
>>> min(data.items(), key=lambda x: (x[1], -len(x[0])))
('aa', 1)

但如果有两个具有相同的值和相同的长度怎么办?你又回到了不知道输出是什么的同样问题。我可能会建立一个匹配键值对的列表,然后对它们进行排序,但正确的做法可能取决于键实际意味着什么。

答案 1 :(得分:1)

我认为一个具体的例子将有助于澄清字典的样子,因为python不直接提供多维dict。

我认为它看起来像这样:data = {'a': 1, 'b': 2, 'b': 3}(注意,这不是有效的python!),所以当你做min(data[id].items(), key=lambda x: x[1])时你希望它返回('a', 1)并检查最长的匹配长度,也许[('b',2),('b',3)]。

如果这是你的意思,那么最简单的方法是使用带有集合的defaultdict:

>>> data = defaultdict(set)
>>> data['a'].add(1)
>>> data['b'].add(2)
>>> data['b'].add(3)
>>> min(data.items(), key=lambda x: min(x[1]))
('a': {1})
>>> min(data.items(), key=lambda x: max(len(x[1])))
('b': {2, 3})