字母列表,更改为带有数字和字母的列表

问题描述

如果我有一个字母列表:

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

如何将其更改为 0 [C1,C2,C3...C6,P1,P2...]

这样做的原因是networkx不允许具有相同标签的节点,但不幸的是我不能去更改原始数据,我需要在这里做。

解决方法

您可以将 defaultdictitertools.count 结合起来制作一个简单干净的解决方案。您基本上为 dict 中的每个字母制作一个计数器,并将其与原始字母连接起来。这应该会让你开始:

from collections import defaultdict
from itertools import count

counter = defaultdict(lambda: count(1))

l = ['C','C','P','G','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','P'],['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','P3'],# ['C1','G2','P2']]

您还可以使用带有适当 axisresult_type 参数的 apply() 将此函数应用于 Pandas 数据帧:

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','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','I','O','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 个,则必须更改此设置。