Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回键匹配值--添加约束_Python_Dictionary - Fatal编程技术网

Python 返回键匹配值--添加约束

Python 返回键匹配值--添加约束,python,dictionary,Python,Dictionary,首先基于值搜索Python字典,以获得键输出对我来说很有意义。但是,如果我们想在搜索中添加另一个约束,该怎么办 例如,我在这里搜索字典(多维)以查找最低值,然后返回该最低值的键: minValue[id] = min(data[id].items(), key=lambda x: x[1]) 由于此方法只返回一个与该值匹配的键,而可能有多个键,因此我想添加另一个约束 是否有一种优雅的方法可以添加:返回包含整体最小值且具有匹配项中最长长度的键?好的,您可以将长度添加到键函数: >>&

首先基于值搜索Python字典,以获得键输出对我来说很有意义。但是,如果我们想在搜索中添加另一个约束,该怎么办

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

minValue[id] = min(data[id].items(), key=lambda x: x[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)

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

我认为一个具体的示例将有助于澄清字典的外观,因为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})