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

Python:使用列表检查单独列表中的项目,如果存在,则替换,python,list,replace,Python,List,Replace,我试图检查列表1中的项目是否在列表2中,如果是,则通过在列表1中添加“u”来替换该项目。需要注意的是,列表1中的项目必须保持原始顺序。我已经找到了一种使用嵌套for循环和枚举来实现这一点的方法,但是我想知道是否有一种更有效/更快的方法,如果合适的话,可能是列表理解或映射?提前谢谢 名单如下: headers = ['Date', 'Temp', 'Descrip', 'ID', 'Lat', 'Long', 'FID'] replace = ['Date', 'ID', 'FID'] 我使

我试图检查列表1中的项目是否在列表2中,如果是,则通过在列表1中添加“u”来替换该项目。需要注意的是,列表1中的项目必须保持原始顺序。我已经找到了一种使用嵌套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 = ['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_']

当然,您可以将i+\uu更改为.joini,出于性能原因,我这样写是为了可读性。

列表理解是您最好的朋友:

>>> 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_']

当然,您可以将i+uu更改为.joini,出于性能原因,我这样写是为了可读性。

您可以使用一行程序,但请注意,它将创建新列表:

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]
或:

或:


您可以使用一个班轮,但请注意,它将创建新列表:

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]
或:

或:


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

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

如果“替换”包含3个以上的项,则希望使用集合而不是列表。如果headers是一个列表,那么headers中的测试s需要在列表中迭代,而如果headers是一个集合,则可以在恒定时间内对headers中的s进行计算,而无需迭代。

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

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

如果“替换”包含3个以上的项,则希望使用集合而不是列表。如果headers是一个列表,则headers中的测试s需要在列表中迭代,而如果headers是一个集合,则可以在恒定时间内对headers中的s进行计算,而无需迭代。

谢谢。是的,这对我有用。我不太关心创建一个新的列表,但最好不要使用长/显式for循环。我希望Python有一个类似于Ruby的bang方法。然而,关于你的评论,我有一个问题。为什么我需要使用set?据我所知,“set”消除了任何冗余。有什么我遗漏的吗?如果我们用.join[s,uu]替换s+u,我们能获得显著的额外性能吗?@9monkeys:大集合的成员资格测试要比大列表快得多-我在我的答案中添加了一条注释。@Selinap:不,即使使用元组而不是列表,这也会慢得多。str.join仅在连接两个以上的字符串时更快,而且仅在字符串较长或有许多字符串时更快。谢谢。是的,这对我有用。我不太关心创建一个新的列表,但最好不要使用长/显式for循环。我希望Python有一个类似于Ruby的bang方法。然而,关于你的评论,我有一个问题。为什么我需要使用set?据我所知,“set”消除了任何冗余。有什么我遗漏的吗?如果我们用.join[s,uu]替换s+u,我们能获得显著的额外性能吗?@9monkeys:大集合的成员资格测试要比大列表快得多-我在我的答案中添加了一条注释。@Selinap:不,即使使用元组而不是列表,这也会慢得多。只有当连接两个以上的字符串时,str.join才会更快,甚至只有当字符串很长或有很多字符串时,str.join也会更快。