Python: использование списка для проверки элементов в отдельном списке и, если он есть, замены - PullRequest
1 голос
/ 27 июня 2011

Я пытаюсь проверить, есть ли элементы в списке один в списке два, и если так, то заменить элемент в списке один на месте (добавив к нему '_').Предостережение заключается в том, что элементы в первом списке должны оставаться в исходном порядке.Я нашел способ сделать это с помощью вложенного цикла for и enumerate, но мне было интересно, есть ли более эффективный / более быстрый метод, возможно, списки или карта, если это уместно?Заранее спасибо.

Списки:

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

Ответы [ 4 ]

7 голосов
/ 27 июня 2011

Если вам не нужно изменять список на месте, вы можете использовать понимание списка:

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

Если replace содержит более 3 элементов, вы хотите использовать набор вместо списка. (Если headers представляет собой список, тест s in headers должен выполнять итерацию по списку, тогда как, если headers является набором, s in headers может оцениваться в постоянное время без итерации.)

2 голосов
/ 27 июня 2011
reps = set(replace)

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

Это изменит список на месте, как сделал ваш оригинальный код. Понимания списка более компактны, но создадут новый список. Я не знаю, это тебя беспокоит или нет.

0 голосов
/ 27 июня 2011

Вы можете использовать однострочник - но учтите, что он создаст новый список:

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+'_')
0 голосов
/ 27 июня 2011

Список пониманий - ваш лучший друг:).

>>> 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+"_" на "".join((i, "_")) из соображений производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...