首页 > 解决方案 > Python在对字典进行排序时出错

问题描述

有一段时间没有使用 Python 了。在对字典进行排序时遇到了一些问题

我有一本字典,叫做bad_functionsholding ~500 pairs

例子 :{'lambda_1': 0, 'lambda_2': 0,, 'lambda_2': "unreserved}

代码 :

from contextlib import redirect_stdout
import subprocess
import json

# deafult region is us-east-2
region="us-east-2"

# command for getting all lambdas lambdas in eu-east-2 
list_lambda_command = "aws lambda list-functions --region {region} --query 'Functions[].FunctionName' --output json"
# command for getting a specific lambda cuoncurrency  
lambda_concurrency="aws lambda get-function-concurrency --function-name {function_name}"

# running the first aws cli command on host and load to list object 
lambda_json_output = subprocess.check_output(['bash','-c', list_lambda_command.format(region=region)]).decode()
lambda_list=json.loads(lambda_json_output)

# empty list for incoming 'bad' lambda's results
bad_functions={}

for function in lambda_list: 
    # getting lambda funcations with unreserved concurreny value into a dict
    try:
        output=subprocess.check_output(['bash','-c', lambda_concurrency.format(function_name=function)]).decode()
        current_lambda_concurrency=json.loads(output)
    except:
        bad_functions[f'{function}']="unreserved"
        continue

    # getting lambda funcations with 'bad' concurreny value value into a dict
    current_concurrency=current_lambda_concurrency['ReservedConcurrentExecutions']
    if current_concurrency != 1:
        bad_functions[f'{function}']=int(current_concurrency)

# sorting the dic by value
print(bad_functions)
bad_functions_sorted={k: v for k, v in sorted(bad_functions.items(), key=lambda item: item[1])}

我得到的错误:

File "script.py", line 40, in <module>
    bad_functions_sorted={k: v for k, v in sorted(bad_functions.items(), key=lambda item: item[1])}
TypeError: '<' not supported between instances of 'str' and 'int'

标签: pythonpython-3.xsortingdictionarylambda

解决方案


我的不好,没有在问题中提供足够的信息。

可能的输出可能是

{'lambda_1': 0, 'lambda_2': 0,, 'lambda_2': "unreserved}

所以错误TypeError: '<' not supported between instances of 'str' and 'int'很有意义

我为解决这个问题所做的是将它们分成 2 个不同的字典

for function in lambda_list: 

    try:
        output=subprocess.check_output(['bash','-c', lambda_concurrency.format(function_name=function)]).decode()
        current_lambda_concurrency=json.loads(output)
    except:
        unreserved_function[f'{function}']="unreserved"
        continue

  current_concurrency=current_lambda_concurrency['ReservedConcurrentExecutions']
    if current_concurrency != 1:
        concurrency_functions[f'{function}']=int(current_concurrency)

并且只对'int'字典进行排序

bad_functions_sorted={k: v for k, v in sorted(concurrency_functions.items(), key=lambda item: item[1])}

推荐阅读