
[code]

    ['AAA_1p', 'AAA_2p', 'BBB_1p' , 'CCC_1p', 'CCC_2p', 'CCC_3p']
    
[/code]

上記のリストから

[code]

    ['AAA_2p', 'BBB_1p','CCC_3p'] # 最大の数
    ['AAA_2p', 'BBB_1p','CCC_2p'] # 2ｐがあれば2ｐ、なければ1ｐ(3ｐは無視)
    
[/code]

のような2パターンの要素を取り出したいのですが、処理方法が全く思いつきません。  
良い処理方法があればお教えください。よろしくお願いします。


CC BY-SA 4.0
2020-03-20T02:12:41.670
63986
2020-03-20T07:41:58.723
38295
question
python
リスト内で部分一致する要素を取り出す


以下は
[itertools.groupby()](https://docs.python.org/3/library/itertools.html#itertools.groupby)
を使う方法です。

[code]

    >>> from itertools import groupby
    >>> lst = ['AAA_1p', 'AAA_2p', 'BBB_1p' , 'CCC_1p', 'CCC_2p', 'CCC_3p']
    
    # 最大の数
    >>> [list(g)[-1] for _, g in groupby(sorted(lst), lambda x: x.split('_')[0])]
    ['AAA_2p', 'BBB_1p', 'CCC_3p']
    
    # 2pがあれば2p、なければ1p(3pは無視)
    >>> [
      next((f'{k}_{i}p' for i in (2, 1) if f'{k}_{i}p' in g))
      for k, g in
        ((k, list(gp)) for k, gp in groupby(sorted(lst), lambda x: x.split('_')[0]))
      if any((f'{k}_{i}p' in g for i in (1, 2)))
    ]
    ['AAA_2p', 'BBB_1p', 'CCC_2p']
    
[/code]

2番目の処理についてですが、サフィックスとして `_2p` か `_1p`
が付いていない要素が存在する場合を考慮しています。具体例としては、以下の様なリストになります(`DDD_4p`)。

[code]

    ['AAA_1p', 'AAA_2p', 'BBB_1p' , 'CCC_1p', 'CCC_2p', 'CCC_3p', 'DDD_4p']
    
[/code]


CC BY-SA 4.0
2020-03-20T07:41:58.723
63994
2020-03-20T07:41:58.723
63986
answer