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

How to get the desired resultant list using list comprehension technique?

我有一个列表:

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', 'name', 'organization', 'notes', 
          'key_length', 'digest', 'validity_start', 'validity_end', 
          'country_code', 'state', 'city', 'organization_name', 'organizational_unit_name',
          'email', 'common_name', 'serial_number', 'certificate', 
          'private_key', 'created', 'modified']

这是我正在做的事情:

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

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

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

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

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

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

如果有,您可以按如下方式指定您想要的位置

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

第一个示例将 list_1 与包含“证书”和“private_key”的列表连接起来,第二个示例将 list_1 的拼接与相同的列表和 list_1.

>>> [field for field in 
list_1[0:17]+['certificate','private_key']+list_1[18::] 
if field not in ['extensions','passphrase']]

#output
['id', 'name', 'organization', 'notes', 'key_length', 'digest',  
'validity_start', 'validity_end', 'country_code', 'state', 'city', 
'organization_name', 'organizational_unit_name', 'email',  
'common_name', 'serial_number', 'certificate', 'private_key',   
'created', 'modified']

作为对你想做列表理解的框架挑战,我发现,至少在你举的例子中,列表理解是最慢的,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']