[英]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.