如何使用列表理解技术获得所需的结果列表?

问题描述

我有一个列表:

list_1 = ['id','name','organization','notes','key_length','digest','validity_start','validity_end','country_code','state','city','organization_name','organizational_unit_name','email','common_name','extensions','serial_number','passphrase','created','modified']

现在,我正在尝试编写一个列表推导式以获得以下列表作为最终结果:

list_2 = ['id','certificate','private_key','modified']

这是我在做什么:

list_2 = [
            field
            for field in list_1
            if field not in {'extensions','passphrase'}
        ]

使用上述 LOC,我可以获得所需的列表,除了 certificateprivate_key 两个字段。 为此,我目前正在使用 insert 方法,但我希望这在列表理解本身中完成。

解决方法

如果列表中的位置无关紧要:

ALTER DEFAULT PRIVILEGES FOR ROLE fdovy1a969c6
   GRANT EXECUTE ON FUNCTION TO PUBLIC,fdovy1a969c6;

如果是,您可以指定您想要的位置,如下所示

[field for 
field in list_1+["certificate","private_key"] 
...

第一个示例将 list_1 与包含“certificate”和“private_key”的列表连接起来,第二个示例将 list_1 的拼接与相同的列表和 list_1 的其余部分连接起来。

[field for 
field in list_1[0:17]+['certificate','private_key']+list_1[18::]
...
,

如果你想替换一个项目,请使用映射字典。

map_dict = {'extensions': 'certificate','passphrase': 'private_key'}
list_2 = 
    map_dict[field] if field in {'extensions','passphrase'}
    else field
    for field in list_1
]
,

作为对你想做列表理解的框架挑战,我发现,至少在你举的例子中,列表理解是最慢的,LCVcode建议的list_2 = list(set(list_1) - {'extensions','passphrase'})更快,并且

list1a.remove('extensions')
list1a.remove('passphrase')

是最快的。但是,如果您尝试删除的元素不存在,则最后一个方法将引发错误。

要添加元素,您可以执行list_2 = list(set(list_1) - {'extensions','passphrase'})+['certificate','private_key']

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...