Как использовать функцию next () (в python 3.7.2) при итерации списка, содержащего дубликаты? - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть строка, скажем, p = '25 VHVH 74 V 6 HV 8 VH '.Здесь VHVH, V, HV, VH называются цепями.цепочка1 = цепочка VHVH2 = цепочка V3 = цепочка HV4 = цепочка VH.

Я хотел случайным образом выбрать любую цепочку и дополнить их (означает изменение H на V или V на H) в строке.

Например, если я возьму chain1, моя строка будет p = '25 HVHV 74V6HV8VH ', если я возьму chain4, тогда моя строка будет p =' 25VHVH74V6HV8 HV '

Краткое описание:

Ввод: '25 VHVH 74 V 6 HV 8 VH '

выход: '25 HVHV 74V6HV8VH' или '25VHVH74 H 6HV8VH' или '25VHVH74V6 VH 8VH' или '25VHV8746 HV ''

В настоящее время я могу получить индекс начала каждой цепочки.Затем, используя list.index (), я должен заменить один из них, но я считаю, что это неэффективный способ добиться того, чего я хочу.Я застрял в этом факте ...

    pe = list(enumerate(polish_exp))
    chain_pos = {}
    for i in pe:
        if i[1] in ['H','h','V','v']:
            chain_pos.update({i[0]:[i[1]]})
            count = 0
            for j in pe[pe.index(i)+1:]:
                if j[1] in ['H','h','V','v']:
                    chain_pos[i[0]].append(j[1])
                    count += 1
                else:
                    break
    print(chain_pos)

Вывод, который я получаю в настоящее время для вышеуказанного кода

{2: ['V'], 4: ['H'],8: ['V', 'H'], 9: ['H'], 11: ['V'], 13: ['V', 'H'], 14: ['H']}

Вход: «25VHVH74V6HV8VH»

Ожидаемый выход: «25HVHV74V6HV8VH» или «25VHVH74H6HV8VH» или «25VHVH74V6VH8VH» или «25VHVH74V6HV8H»

1 Ответ

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

Наконец я нашел решение самостоятельно. И вот оно !!!!

def complement_chain(string):
    p = dict(enumerate(string))
    chain_pos = {}
    for i in p.keys():
        if p[i] in ['H','h','V','v']:
            if p[i-1] not in ['H','h','V','v']:
                chain_pos.update({i:[p[i]]})
                for j in list(p.keys())[i+1:]:
                    if p[j] in ['H','h','V','v']:
                        chain_pos[i].append(p[j])
                    else:
                        chain_pos.update({i:''.join(chain_pos[i])})
                        break
    chosen_chain_key = random.choice(list(chain_pos.keys()))
    transtable = str.maketrans('hHvV','vVhH')
    chain_pos.update({chosen_chain_key:chain_pos[chosen_chain_key].translate(transtable)})
    l = chosen_chain_key + len(chain_pos[chosen_chain_key])
    new_string = string[:chosen_chain_key] + chain_pos[chosen_chain_key] + string[l:]
    return new_string

Тестовый вход: 2HV1H37HVHV6V8VHV9

Выход 1: 2HV1 V 37HVHV6V8VHV9

Выход2: 2HV1H37HVHV6V8 HVH 9

Выход 3: 2HV1H37HVHV6 H 8VHV9

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