我有一个清单,如下所示。此列表存储每个名称发生的错误以及有关是否直接或间接查询该名称的信息。
errors=[
{
'name': 'name-1',
'type':'direct_queried',
'error': 'unknown error'
},
{
'name': 'name-2',
'type':'indirect_queried',
'error': 'some denied error'
},
{
'name': 'name-3',
'type':'direct_queried',
'error': 'some not found error'
},
{
'name': 'name-4',
'type':'direct_queried',
'error': 'some denied error'
},
]然后,从给定的名称列表中,我必须根据发生的错误分隔名称(如果该名称有错误的话)。
所以下面列出的名字,
names=['name-1','name-2','name-3']输出应该如下所示。另外,我只对direct_queried错误类型感兴趣。
success=[] // as error occurred for each name in the names list
unauthorized=['name-4'] // as error message contains denied and the error type is direct queried.
not_found=['name-3'] // as error message contains not found and the error type is direct queried.
unknown=['name-1'] // as error is direct queried and error is not denied or not found.
// 'name-2' is excluded as it's indirectly queried error.我试图使用一种方法,在一个线性列表-理解的方式,如下所示。推荐信
success=[name for name in names if ....(check each item in errors list and see if this name matches doesn't match any name in errors list whose type is direct_queried.)]
unauthorized=[name for name in names if ....(check each item in errors list and see if this name matches any name in errors list whose type is direct_queried and error contains denied word.)]
not_found=[name for name in names if ....(check each item in errors list and see if this name matches any name in errors list whose type is direct_queried and error contains not found.)]
unknown=[name for name in names if ....(check each item in errors list and see if this name matches any name in errors list whose type is direct_queried and error doesn't contain denied or not found word.)]有人能用这个指引我吗?
发布于 2022-06-02 11:03:10
你在找这个吗?
success = [
item for item in errors
if item["name"] not in names and item["type"] == "direct_queried"
]发布于 2022-06-02 11:05:05
您需要在列表理解中遍历errors,而不是names:
unauthorized = [
error["name"] for error in errors
if error["error"] == "unauthorized"
]然后你可以过滤掉你想要的名字:
unauthorized = [name for name in unauthorized if name in names]或者,你可以把它放在一个单一的理解中:
unauthorized = [
error["name"] for error in errors
if error["error"] == "unauthorized" and error["name"] in names
]或者您可以使用设置和集合理解:
names = {"name-1", "name-2", "name-3"]
unauthorized = names & {error["name"] for error in errors if error["error"] == "unauthorized"}( &运算符表示集合相交
如果发现必须针对不同类型的错误重复这种构造,则可以将其提取到一个函数中:
def find_errors(errors, names, error_type):
return names & {e for e in errors if e["error"] == error_type}
names = {"name-1", "name-2", "name-3", "name-4"}
unauthorized = find_errors(errors, names, "unauthorized")发布于 2022-06-02 11:11:57
在这里,希望这能帮上忙:
errors=[
{
'name': 'name-1',
'type':'direct_queried',
'error': 'unknown error'
},
{
'name': 'name-2',
'type':'indirect_queried',
'error': 'some denied error'
},
{
'name': 'name-3',
'type':'direct_queried',
'error': 'some not found error'
},
{
'name': 'name-4',
'type':'direct_queried',
'error': 'some denied error'
},
]
names = names=['name-1','name-2','name-3', 'name-4', 'name-5']
success = [name for name in names if name not in [error['name'] for error in errors]]
unknown = [error['name'] for error in errors if 'unknown' in error['error'].lower()]
not_found = [error['name'] for error in errors if 'not found' in error['error'].lower()]
unauthorized = [error['name'] for error in errors if 'denied' in error['error'].lower()]
print("success: ", success)
print("Unknown: ", unknown)
print("not_found: ", not_found)
print("unauthorized: ", unauthorized)产出:
success: ['name-5']
Unknown: ['name-1']
not_found: ['name-3']
unauthorized: ['name-2', 'name-4']https://stackoverflow.com/questions/72475066
复制相似问题