Замените группу элементов определенным элементом в python3 - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть список из более чем 50 элементов.Эти элементы представляют собой строчные и прописные алфавиты, цифры, специальные символы.

например.

sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D'] 

Я хочу поменять отдельные элементы специальным символом.например.

replacing `A,B,C and 1 with @
replacing `D,E,F and 2 with &
replacing `G,H,I and 3 with (

и так далее, я должен заменить определенный набор элементов 11 выбранными специальными символами.Как я заменил несколько выбранных элементов на 3 специальных символа.

Как это сделать эффективно.

Ответы [ 5 ]

0 голосов
/ 16 февраля 2019

Начните с простой функции и уточните ее.

Simple будет использовать 3 sets (для поиска набор лучше, чем списки) - если наборы не нуждаются в мутировании, используйте вместо этого frozensets.Используйте простой цикл - прямо:

sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D'] 

new_list = []
for item in sample_list:
    abc = frozenset("ABC")    # frozensets do not change, they are immuteable
    dfe = frozenset("DEF")    # and fast for lookups. this is less performant
    ghi = frozenset("GHI")    # then using a dict - but it works as well

    if item in abc:
        new_list.append("@")
    elif item in dfe:
        new_list.append("&")
    elif item in ghi:
        new_list.append("(")
    else:
        new_list.append(item)

print(new_list)

Вывод:

['1', '0', 'b', '@', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', '@', '@', 'f', '&', '&', '3', '@', '8', '@', '&', '@', '@', '@', '&']

Чтобы получить больше фантазий, используйте словарь и список-комп:

transform = {"A":"@", "B":"@", "C":"@", 
             "D":"&", "E":"&", "F":"&", 
             "G":"(", "H":"(", "I":"("}

new_list = [ transform.get(i,i) for i in sample_list]

Вывод:

['1', '0', 'b', '@', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', '@', '@', 'f', '&', '&', '3', '@', '8', '@', '&', '@', '@', '@', '&']

См .:

0 голосов
/ 16 февраля 2019

Вы можете использовать функцию map:

Ex для первой замены:

new_list = map(lambda x: '@' if x in ('A', 'B', 'C') else x, sample_list)

sample_list также может быть строкой (каждый символ - один элемент, но map возвращает массивв любом случае).

В «строковом» списке вы можете просто использовать метод замены:

compact_list = ''.join(sample_list)
new_compact_list = compact_list.replace('A', '@').replace('B', '@').replace('C', '@')

Конечно, если список источников является переменным, запишите в него цикл ...

0 голосов
/ 16 февраля 2019

Вы можете сделать это, используя метод translate следующим образом:

sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D']
t = ''.maketrans('ABC1DEF2GHI3','@@@@&&&&((((')
out = [i.translate(t) for i in sample_list]
print(out)

Вывод:

['@', '0', 'b', '@', '&', '6', 'a', '7', '9', '5', 'c', 'd', '4', '@', '@', 'f', '&', '&', '(', '@', '8', '@', '&', '@', '@', '@', '&']

maketrans метод str используется для создания таблицы перевода,просто введите его с двумя равными длинами str с, первый из которых состоит из ключей, а второй из значений.translate метод принимает эту таблицу и заменяет символы соответствующим образом, или оставляет оригинал без изменений, если в таблице нет такого ключа.

РЕДАКТИРОВАТЬ: Как отметил Оливье Мелансон, его можно использовать, только если вы хотите заменить 1символ с 1 символом.

0 голосов
/ 16 февраля 2019

Попробуйте это и установите все ваши отображения в словаре:

chars = {"@": ["A", "B", "C", "1"], "&": ["D", "E", "F", "2"]}
sample_list = ['1', '0', 'b', 'B', '2', '6', 'a', '7', '9', '5', 'c', 'd', '4', 'A', 'C', 'f', 'D', 'F', '3', 'C', '8', 'A', 'F', 'B', 'A', 'A', 'D']

for k, v in chars.items():
    for value in v:
        if value in sample_list:
            ind = [index for index, val in enumerate(sample_list) if val == value]            
            for x in ind:
                sample_list[x] = k


print(sample_list)
0 голосов
/ 16 февраля 2019

Сначала необходимо определить правила замены, например, с помощью dict.В частности, поскольку dict разрешает O (1) доступ, это так же быстро, как ваш метод сможет получить усложнение по времени: то есть решить это за один обход списка.

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

rules = {
    'A': '@',
    'B': '@',
    'D': '&',
    'E': '&'
}

for i, c in enumerate(sample_list):
    if c in rules:
        sample_list[i] = rules[c]

Если вы хотите создать новый список вместо того, чтобы поменять первоначальный, вы можете использоватьсписок-понимание

new_list = [rules.get(c, c) for c in sample_list]

Пример

rules = {
    'A': '@',
    'B': '@',
    'D': '&',
    'E': '&'
}

sample_list = ['A', 'A', 'B', 'C', 'D', 'E', 'F']

new_list = [rules.get(c, c) for c in sample_list]

print(new_list)

Вывод

['@', '@', '@', 'C', '&', '&', 'F']
...