Python: сравнить первые n символов элемента в списке с первыми n символами всех других элементов в этом списке - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужно сравнить первые n символов элементов в списке с первыми n символами других элементов в том же списке, а затем удалить или оставить один из этих элементов.

В приведенном ниже примере списка«AB2222_100» и «AB2222_P100» будут считаться дубликатами (даже если они технически уникальны), потому что первые 6 символов совпадают.При сравнении двух значений, если x [-4:] = "P100", то это значение будет сохранено в списке, а значение без «P» будет удалено.Другие элементы в списке будут сохранены, поскольку дубликатов не существует, независимо от того, является ли он суффиксом «P100» или «100» в конце строки.В этом случае никогда не будет более одного дубликата («P» или нет).

  • AB1111_100
  • AB2222_100
  • AB2222_P100
  • AB3333_P100
  • AB4444_100
  • AB5555_P100

Я понимаю срезы и сравнения, но все принимает уникальные значения.Я надеялся использовать списочное понимание вместо длинного цикла for, но также хочу понять, что я вижу.Я заблудился, пытаясь выяснить коллекции, наборы, почтовые индексы и т. Д. Для этого неуникального сценария.

Нарезка и сравнение не сохранят требуемый суффикс, который необходимо сохранить в окончательном вариантеlist.

newList = [x[:6] for x in myList]

Вот так он должен начинаться и заканчиваться.

myList = ['ABC1111_P100', 'ABC2222_100', 'ABC2222_P100', 'ABC3333_P100', 'ABC4444_100', 'ABC5555_P100']

newList = ['ABC1111_P100', 'ABC2222_P100', 'ABC3333_P100', 'ABC4444_100', 'ABC5555_P100']

1 Ответ

0 голосов
/ 17 апреля 2019

Как указано в ваших комментариях, вы не можете сделать это в один лайнер. Вы можете сделать это за O(n) время, но это займет некоторое дополнительное пространство:

myList = ['ABC1111_P100', 'ABC2222_100', 'ABC2222_P100', 'ABC3333_P100', 'ABC4444_100', 'ABC5555_P100']
seen = dict()

print(myList)
for x in myList:
    # grab the start and end of the string
    start, end = x.split('_')
    if start in seen: # If we have seen this value before
        if seen[start] != 'P100': # Did that ending have a P value?
            seen[start] = end # If not swap out the P value
    else:
        # If we have not seen this before then add it to our dict.
        seen[start] = end

final_list = ["{}_{}".format(key, value) for key, value in seen.items()]
print(final_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...