繁体   English   中英

Python:使用列表检查单独列表中的项目,如果存在,则替换

[英]Python: Using a list to check items in a seperate list and if present then replace

我正在尝试检查列表一中的项目是否在列表二中,如果是这样,则替换掉列表一中的项目(通过在其后附加一个“ _”)。 需要注意的是,列表一中的项目必须保持原始顺序。 我想出了一种使用嵌套的for循环并枚举的方法,但是我想知道是否有更有效/更快速的方法,如果可能的话,可能是列表理解或映射? 提前致谢。

这些列表是:

 headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID']
 replace = ['Date', 'ID', 'FID']

我使用的代码是:

 for rep in replace:
         for index, head in enumerate(headers):
                 if rep == head:
                         headers[ index ] = headers[ index ] + '_'

答案应该是:

 ['Date_', 'Temp', 'Descrip', 'ID_', 'Lat', 'Long', 'FID_']

如果您不需要就地修改列表,则可以使用列表理解:

headers = [s + "_" if s in replace else s for s in headers]

如果replace包含3个以上的项目,则要使用集合而不是列表。 (如果headers是一个列表,则s in headers的test s in headers需要遍历该列表,而如果headers是一个set,则可以在恒定时间内对s in headers进行评估,而无需进行迭代。)

reps = set(replace)

for index, head in enumerate(headers):
    if head in reps:
        headers[index] += "_"

就像原始代码一样,这将修改列表。 列表推导更加紧凑,但是会创建一个新列表。 我不知道您是否担心。

清单理解力是您最好的朋友:)。

>>> headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID']
>>> replace = ['Date', 'ID', 'FID']
>>> [i+"_" if i in replace else i for i in headers]
['Date_', 'Temp', 'Descrip', 'ID_', 'Lat', 'Long', 'FID_']

当然"".join((i, "_"))出于性能原因,您可以将i+"_"更改为"".join((i, "_"))为便于阅读,我将其编写为此类。

您可以使用单线-但请注意,它将创建新列表:

headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID']
rVals = ['Date', 'ID', 'FID']

res = [x if x not in rVals else x+'_' for x in headers]

要么:

map(lambda x: x if x not in rVals else x+'_', headers)

要么:

for x in (x for x in rVals if x in headers):
    headers.__setitem__(headers.index(x),x+'_')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM