Python 从dict键列表中查找嵌套的最大/最小值

Python 从dict键列表中查找嵌套的最大/最小值,python,dictionary,nested,max,min,Python,Dictionary,Nested,Max,Min,我有一个大文件中的嵌套键值列表: mainLs = [{'99999': {'popDensity': 0.0, 'housingDensity': 1.8062141714841409e-07}, '53000': {'popDensity': None, 'housingDensity': None}, '56938': {'popDensity': None, 'housingDensity': None}, '22594': {'popDensity': 0.00376239918825

我有一个大文件中的嵌套键值列表:

mainLs = [{'99999': {'popDensity': 0.0, 'housingDensity': 1.8062141714841409e-07}, '53000': {'popDensity': None, 'housingDensity': None}, '56938': {'popDensity': None, 'housingDensity': None}, '22594': {'popDensity': 0.003762399188257728, 'housingDensity': 0.002336601878903448}, '49194': {'popDensity': 0.0, 'housingDensity': 0.0005159765063886844}, '54232': {'popDensity': 0.0, 'housingDensity': 0.00046439265846193704}, '06000': {'popDensity': None, 'housingDensity': None}, '00562': {'popDensity': 0.0007453821299310868, 'housingDensity': 0.00035915666845218}, '68084': {'popDensity': 0.0, 'housingDensity': 0.0}}]
我想返回一个用户友好的字符串来记录popDensity最高的位置

def find_densest(k, lst):
    placeId = max(lst, key =lambda place: lst[place][k] if place[k])
    ans =  "Densest placeFIPS is " + str(placeId) + " for " + k
    print(ans)

# Expected Output
find_densest('popDensity', mainLs)
>>> "The densest place ID is 22594 with the popDensity of 0.003762399188257728"

我需要保留同一位置的多个实例作为密钥。有办法做到这一点吗?

您的按键功能有两个问题:

lambda density: lst[density][k]
首先,键函数的参数将是
lst
的一个元素-一个位置
dict
,而不是一个密度,或者任何可以用作
列表
索引的元素。因此:

lambda place: place[k]
这就是导致当前
类型错误的原因;您试图使用place
dict
作为列表的索引


但如果你解决了这个问题,你就会有另一个问题。您试图对一组值调用
max
,这些值包括
float
s和
None
。这是不明确的,Python不会试图猜测您的意思。
None
是否意味着没有人口,所以它应该算作最小人口,或者是未知人口,所以应该跳过它,或者……什么?一旦可以用英语解释规则,就可以将其翻译成Python

例如,这里有一个键函数,它将
None
视为最低值:

place = max(lst, key=lambda place: place[k] if place[k] is not None else -1)
或者,这里有一个跳过
None
值的生成器表达式:

place = max((place for place in lst if place[k] is not None),
            key=lambda place: place[k])

同时,这假设您首先拥有的是一个有效的dict列表。您向我们展示的是一个
语法错误
,因此很难猜测您真正拥有什么。也许是一份口述目录,或者是一份口述目录?在不知道的情况下,你在迭代你所拥有的任何东西的过程中肯定会有另一个错误……但除非我们能看到你真正拥有的东西,否则就不可能告诉你如何修复它


例如,如果您有一个dict的dict,那么
mainLs
中的每个东西都将只是一个地名,而不是一个地方
dict
。另一方面,如果它是一个dict的列表,那么
mainLs
中的每一个东西都将是一个dict,它唯一的键是一个地名,唯一的值是一个place
dict
,在这种情况下,您需要查找该值中的密度,不在顶级词典中。一个适用于其中一个词典的解决方案在没有更改的情况下将不适用于其他词典。

您有一个词典列表还是一个词典?我在一个单独的mainLs列表中有152个词典条目。我必须使用列表,因为“place”键可能有重复。@akh88然后
mainLs
应该以{还有,请把你的问题变成一个问题。如果有人试图运行这个,他们只会得到一个
SyntaxError
,因为你的
mainLs
是无效的;它是介于列表和dict之间的一个不合法的东西。如果你不能将这个代码复制粘贴到解释器中并重现这个问题,那么peo也不能ple正在尝试帮助您。您编辑的版本无法解决我上面询问的任何问题。示例输入仍然是一个
语法错误
,并且您仍然没有包含异常。