

リスト内を部分一致で検索する方法について分からず困っております。  
以下リストで、例えば’.xlsx’が含まれるものだけを、新しリストに追加したい場合、  
コードをどのように記述すればいいのでしょうか？  
inはリスト内の検索では完全一致でしか適用しないような様子でした。  
よろしくお願いいたします。

↓これだけといけるのですが、

[code]

    list = ['aaa.xlsx','bbb.xlsx','ccc.csv']
    newlist = []
    kensaku = 'aaa.xlsx'
    if kensaku in list:
            newlist.append(kensaku)
    
[/code]

↓これだけいけません

[code]

    list = ['aaa.xlsx','bbb.xlsx','ccc.csv']
    newlist = []
    kensaku = '.xlsx'
    if kensaku in list:
            newlist.append(kensaku)
    
[/code]


CC BY-SA 3.0
2017-04-01T17:33:06.770
33700
2017-04-01T22:37:25.883
2017-04-01T18:42:00.427
3605
21314
question
python
Python　リスト内を部分一致で検索する方法について


こんな感じでどうでしょうか。

[code]

    l = ['aaa.xlsx', 'bbb.xlsx', 'ccc.csv']
    newl = []
    kensaku = '.xlsx'
    if any(s.endswith(kensaku) for s in l):
        newl.append(kensaku)
    
[/code]

`s.endswith(kensaku) for s in l`の部分は、`l`の要素を一つ一つ`kensaku`で終わっているか確認してブール値のリスト
(実際はジェネレータですが) を返します。上の例だと`[True, True, False]`を返します。  
`any`は、引数のリストの中の要素が一つでも`True`なら、`True`を返しますので、`any(s.endswith(kensaku) for s
in l)`は全体として、`l`の中の文字列がどれか一つでも`kensaku`で終わっていれば`True`を返します。

* * *

余談ですが`list`は、Pythonでデフォルトで定義されている型です。

[code]

    list = ['aaa.xlsx','bbb.xlsx','ccc.csv']
    
[/code]

とすると上書きしてしまい、型名として使えなくなってしまうので避けたほうがいいです。


CC BY-SA 3.0
2017-04-01T19:22:47.743
33701
2017-04-01T19:22:47.743
3605
33700
answer


リスト要素それぞれについて部分一致したものを取り出す、という便利な機能はないので、以下のように書きます。

[code]

    list = ['aaa.xlsx','bbb.xlsx','ccc.csv']
    newlist = []
    kensaku = '.xlsx'
    for l in list:
        if kensaku in l:
            newlist.append(l)
    
[/code]

内包表記を使って以下のように書いても良いでしょう。

[code]

    list = ['aaa.xlsx','bbb.xlsx','ccc.csv']
    newlist = [l for l in list if '.xlsx' in l]
    
[/code]

拡張子を取り出したいのであれば、Hidekiさんが書かれているように、.endswithを使う方がより正確です。

[code]

    list = ['aaa.xlsx','bbb.xlsx','ccc.csv']
    newlist = [l for l in list if l.endswith('.xlsx')]
    
[/code]


CC BY-SA 3.0
2017-04-01T22:37:25.883
33702
2017-04-01T22:37:25.883
806
33700
answer