【问题标题】:List of letters, change to list with numbers and letters字母列表,更改为带有数字和字母的列表
【发布时间】:2021-02-15 23:45:52
【问题描述】:

如果我有一个字母列表:

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不允许节点具有相同的标签,但不幸的是我不能去改变原始数据,我需要在这里做。

【问题讨论】:

    标签: python graph networkx stellargraph


    【解决方案1】:

    您可以将defaultdictitertools.count 结合使用,以创建一个简单的清洁解决方案。您基本上为字典中的每个字母制作一个计数器,并将其与原始字母连接起来。这应该可以帮助您开始:

    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']]
    

    您还可以使用带有适当 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', '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
    

    【讨论】:

    • 实际上我做到了df['Ln'] = df['Ln'].apply(addnum) 并且成功了。我不希望它扩大。但是感谢代码,它帮了很多忙。
    【解决方案2】:

    此解决方案假定所有相同的字母组合在一起并且是一个数字。

    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 个相同的字母,则必须更改此设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多