Список букв, перейти в список с цифрами и буквами

Если у меня есть список писем:

      Out[30]: 
                                                      LN
0      [C, C, C, C, C, C, G, I, O, P, P, P, R, R, R, ...
1      [C, C, C, C, C, C, G, I, O, P, P, P, R, R, R, ...
2      [C, C, C, C, C, C, G, I, O, P, P, R, R, R, R, ...
3      [C, C, C, C, C, C, G, I, O, P, P, R, R, R, R, ...
4      [C, C, C, C, C, C, G, I, O, P, P, P, R, R, R, ...
                                                  ...
43244                     [G, I, O, P, P, P, R, R, R, R]
43245                     [G, I, O, P, P, P, R, R, R, R]
43246                           [G, I, O, P, P, R, R, R]
43247                           [G, I, O, P, P, R, R, R]
43248                                 [G, I, O, P, R, R]

Как я могу изменить его на 0 [C1, C2, C3...C6, G, I, O, P1, P2...]

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

2 ответа

Решение

Вы можете комбинировать <tcode id="232735"></tcode> с <tcode id="232736"></tcode>чтобы сделать простое чистое решение. По сути, вы делаете счетчик для каждой буквы в слове и соединяете его с исходной буквой. Это должно помочь вам начать:

      from collections import defaultdict
from itertools import count

counter = defaultdict(lambda: count(1))

l = ['C', 'C', 'C', 'P', 'P', 'G', 'C', 'P']

[c + str(next(counter[c])) for c in l]
# ['C1', 'C2', 'C3', 'P1', 'P2', 'G1', 'C4', 'P3']

Вы можете немного упростить defaultdict, если не возражаете против отсчета, начинающегося с нуля:

      counter = defaultdict(count)

Вы, конечно, можете применить это к списку списков:

      from collections import defaultdict
from itertools import count


l = [
    ['C', 'C', 'C', 'P', 'P', 'G', 'C', 'P'],
    ['C', 'C', 'G', 'P', 'C', 'G', 'C', 'P']
]

def addNumbs(l):
    counter = defaultdict(lambda: count(1))
    return [c + str(next(counter[c])) for c in l]
        
list(map(addNumbs, l))
#[['C1', 'C2', 'C3', 'P1', 'P2', 'G1', 'C4', 'P3'],
# ['C1', 'C2', 'G1', 'P1', 'C3', 'G2', 'C4', 'P2']]

Вы также можете применить эту функцию к фрейму данных Pandas, используя <tcode id="232740"></tcode> с соответствующими axis и result_type параметры:

      import pandas as pd
from collections import defaultdict
from itertools import count

def addNumbs(l):
    counter = defaultdict(lambda: count(1))
    return [c + str(next(counter[c])) for c in l]


df = pd.DataFrame([
    ['C', 'C', 'C', 'P', 'P', 'G', 'C', 'P'],
    ['C', 'C', 'G', 'C', 'G', 'G', 'C', 'P']
])

res = df.apply(addNumbs, axis=1, result_type="expand")

res будет:

          0   1   2   3   4   5   6   7
0  C1  C2  C3  P1  P2  G1  C4  P3
1  C1  C2  G1  C3  G2  G3  C4  P1

Это решение предполагает, что все одинаковые буквы сгруппированы вместе и представляют собой одну цифру.

      letters = ['C','C','C','G', 'I', 'O', 'P', 'P', 'P', 'R', 'R', 'R','R']

for i in range(len(letters)):
    if i != 0:
        current_word = letters[i]
        prev_word = letters[i-1]
        if current_word[0] == prev_word[0]:
            if len(prev_word) == 1:
                letters[i] = current_word + '1'
            else:
                letters[i] = current_word[0] + str(int(prev_word[1]) + 1)
print(letters)

Это должно быть изменено, если есть вероятность того, что одна и та же буква подряд будет больше 10.

Другие вопросы по тегам