Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用列表理解技术获得所需的结果列表?_Python_List_List Comprehension - Fatal编程技术网

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

Python 如何使用列表理解技术获得所需的结果列表?,python,list,list-comprehension,Python,List,List Comprehension,我的名单如下: 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

我的名单如下:

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,我能够获得所需列表,除了两个字段
certificate
,&
private\u key

为此,目前我正在使用insert方法,但我希望在列表理解本身中完成此操作。

如果要替换项,请使用映射词典

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::]
...
第一个示例将列表_1与包含“证书”和“私钥”的列表连接起来,第二个示例将列表_1与相同的列表和列表_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']

我可能错了,但我在
list_1
中找不到证书或私钥,因此无法使用列表理解将它们放入
list_2
。列表理解用于替换和函数,但不是在
列表中添加内容,这是事实,但我们可以在处理理解之前连接两个列表。波斯特回答了你的问题吗?对于列表1+['certificate'、'private\u key']
@Thymen中的字段,可以执行
列表2=[…]+['certificate'、'private\u key']
,但不能在列表中执行。要在内部执行,他可以遵循的解决方案是,通过将列表理解中的两个列表连接起来来解决问题,如
list_2=[…+[]]
。我猜理解中的措辞有点模糊。对我来说,使用
[x代表列表中的x+['c',p']]
将符合理解的“内部”,尽管不是内部。不管怎样,@DeMO的答案都能很好地抓住它。嘿,我被要求从
列表1
中删除
扩展名和
密码短语,这样我就不会得到所需的结果。@manishhah我添加了一个代码块,显示完整的代码和收到的输出。