2012-03-20 121 views
0

首先根據該值搜索Python字典,以獲得鍵輸出對我有意義。但是如果我們想要爲搜索添加另一個約束呢?返回鍵匹配值 - 添加約束

舉例來說,我在這裏尋找一本字典(多維)的最低值,然後返回該最低值的關鍵:

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

由於這種方法只返回值匹配一個關鍵,雖然可能有多個,但我想添加另一個約束。

是否有一個優雅的方式來添加:返回鍵包含總體最小值和具有最長的匹配長度?

回答

1

我認爲一個具體的例子將有助於澄清字典的樣子,因爲python不直接提供多維字典。

我認爲它看起來是這樣的: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}) 
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) 

但如果有兩個具有相同值和相同的長度?你回到了不知道輸出是什麼的同樣的問題。我可能會建立一個匹配鍵值對的列表,然後對它們進行排序,但是正確的做法可能取決於鍵的實際含義。