首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中使用嵌套列表理解?

如何在python中使用嵌套列表理解?
EN

Stack Overflow用户
提问于 2022-06-02 10:55:29
回答 3查看 49关注 0票数 1

我有一个清单,如下所示。此列表存储每个名称发生的错误以及有关是否直接或间接查询该名称的信息。

代码语言:javascript
复制
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'
    },

]

然后,从给定的名称列表中,我必须根据发生的错误分隔名称(如果该名称有错误的话)。

所以下面列出的名字,

代码语言:javascript
复制
names=['name-1','name-2','name-3']

输出应该如下所示。另外,我只对direct_queried错误类型感兴趣。

代码语言:javascript
复制
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.

我试图使用一种方法,在一个线性列表-理解的方式,如下所示。推荐信

代码语言:javascript
复制
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.)]

有人能用这个指引我吗?

EN

回答 3

Stack Overflow用户

发布于 2022-06-02 11:03:10

你在找这个吗?

代码语言:javascript
复制
success = [
    item for item in errors
    if item["name"] not in names and item["type"] == "direct_queried"
]
票数 0
EN

Stack Overflow用户

发布于 2022-06-02 11:05:05

您需要在列表理解中遍历errors,而不是names

代码语言:javascript
复制
unauthorized = [
    error["name"] for error in errors
    if error["error"] == "unauthorized"
]

然后你可以过滤掉你想要的名字:

代码语言:javascript
复制
unauthorized = [name for name in unauthorized if name in names]

或者,你可以把它放在一个单一的理解中:

代码语言:javascript
复制
unauthorized = [
    error["name"] for error in errors
    if error["error"] == "unauthorized" and error["name"] in names
]

或者您可以使用设置和集合理解:

代码语言:javascript
复制
names = {"name-1", "name-2", "name-3"]
unauthorized = names & {error["name"] for error in errors if error["error"] == "unauthorized"}

( &运算符表示集合相交

如果发现必须针对不同类型的错误重复这种构造,则可以将其提取到一个函数中:

代码语言:javascript
复制
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")
票数 0
EN

Stack Overflow用户

发布于 2022-06-02 11:11:57

在这里,希望这能帮上忙:

代码语言:javascript
复制
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)

产出:

代码语言:javascript
复制
success:  ['name-5']
Unknown:  ['name-1']
not_found:  ['name-3']
unauthorized:  ['name-2', 'name-4']
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72475066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档