2016-03-31 15 views
0

私はファイル名のリストを使って作業しています。重複はなく、リストはソートされます。リストをサブセットの場所に基づいてリストのリストに変更します

リストはサブセットにグループ化できます。名前に_0001があるファイルは、新しいサブセットの開始を示します。次に_0002はサブセットの2番目の項目です。このフラットリストを階層リストに変換したいと思います。ここで

は、元の、フラットリストの例である:

['Log_03-22-2016_12-06-18_GMT_0001.log', 
'Log_03-22-2016_12-10-41_GMT_0002.log', 
'Log_03-22-2016_12-11-56_GMT_0003.log', 
'Log_03-22-2016_12-13-12_GMT_0004.log', 
'Log_03-22-2016_12-14-27_GMT_0005.log', 
'Log_03-22-2016_12-15-43_GMT_0006.log', 
'Log_03-22-2016_12-16-58_GMT_0007.log', 
'Log_03-23-2016_09-08-57_GMT_0001.log', 
'Log_03-23-2016_09-13-24_GMT_0002.log', 
'Log_03-23-2016_09-14-26_GMT_0003.log', 
'Log_03-23-2016_09-15-27_GMT_0004.log', 
'Log_03-23-2016_11-17-57_GMT_0001.log', 
'Log_03-23-2016_11-19-21_GMT_0002.log'] 

私は新しいサブセットの始まりを検出するために、_0001の存在を使用して、サブセットのリストにこれをスライスしたいと思います。サブセットのすべてのリストのリストを返します。上記の入力を使用した出力の例を次に示します。

[['Log_03-22-2016_12-06-18_GMT_0001.log', 
    'Log_03-22-2016_12-10-41_GMT_0002.log', 
    'Log_03-22-2016_12-11-56_GMT_0003.log', 
    'Log_03-22-2016_12-13-12_GMT_0004.log', 
    'Log_03-22-2016_12-14-27_GMT_0005.log', 
    'Log_03-22-2016_12-15-43_GMT_0006.log', 
    'Log_03-22-2016_12-16-58_GMT_0007.log'], 
['Log_03-23-2016_09-08-57_GMT_0001.log', 
    'Log_03-23-2016_09-13-24_GMT_0002.log', 
    'Log_03-23-2016_09-14-26_GMT_0003.log', 
    'Log_03-23-2016_09-15-27_GMT_0004.log'], 
['Log_03-23-2016_11-17-57_GMT_0001.log', 
    'Log_03-23-2016_11-19-21_GMT_0002.log']] 

ここに私の解決策があります。

import glob 

first_log_indicator = '_0001' 

log_files = sorted(glob.glob('Log_*_GMT_*.log')) 

first_logs = [s for s in log_files if first_log_indicator in s] 

LofL = [] 

if len(first_logs) > 1: 
    for fl_idx, fl_name in enumerate(first_logs): 
     start_slice = log_files.index(fl_name) 
     if fl_idx + 1 < len(first_logs): 
      stop_slice = log_files.index(first_logs[fl_idx+1]) 
      LofL.append(log_files[start_slice:stop_slice]) 
     else: 
      LofL.append(log_files[start_slice:]) 
else: 
    LofL.append(log_files) 

は私がitertoolsに見えた、と私はそのモジュールと明らかに不慣れだが、私は非常にこれをしなかった何も表示されませんでした:それはありますが、これを行うための、よりエレガントでPython的な方法であるべきように思えます。

私が見つけた最も近い質問には、サブリストがfixed lengthでした。ここで、サブリストは任意の長さである。他の者は、元の(平らな)リスト内のサブリストを区切るために "separator"の存在を使用し、最終的にリストのリストを作成するときに投げ捨てられる。私はその意味でセパレータを持っていません。なぜなら、私は元のリストにアイテムを捨てたくないからです。

誰でも上記のものよりも良いアプローチを提案できますか?

+1

私は、これはあなたが探しているものだと思う。http://stackoverflow.com/質問/ 15357830/python-spliting-a-list-on-a-delimiter-wordです。エンドスワップチェックを適用する必要があることを除いて。 – alecxe

答えて

2

あなたは、各シリーズの最初のインデックスを取得し、次のようにリストを分割することができます:

firsts = [i for i, v in enumerate(log_files) if '_0001' in v] 
list_of_lists = [log_files[i:j] for i, j in zip(firsts, firsts[1:] + [None])] 
+0

これは良いですが、技術的には、リストが '0001'以外で始まっていれば、いくつかの値は破棄されるかもしれません。 –

0

私は@spと思います。エレガントなソリューションを持っています。ここではブルーカラーの方法は次のとおりです。

lst = ['Log_03-22-2016_12-06-18_GMT_0001.log', 
'Log_03-22-2016_12-10-41_GMT_0002.log', 
'Log_03-22-2016_12-11-56_GMT_0003.log', 
'Log_03-22-2016_12-13-12_GMT_0004.log', 
'Log_03-22-2016_12-14-27_GMT_0005.log', 
'Log_03-22-2016_12-15-43_GMT_0006.log', 
'Log_03-22-2016_12-16-58_GMT_0007.log', 
'Log_03-23-2016_09-08-57_GMT_0001.log', 
'Log_03-23-2016_09-13-24_GMT_0002.log', 
'Log_03-23-2016_09-14-26_GMT_0003.log', 
'Log_03-23-2016_09-15-27_GMT_0004.log', 
'Log_03-23-2016_11-17-57_GMT_0001.log', 
'Log_03-23-2016_11-19-21_GMT_0002.log'] 

lsts = [] 
buf = [lst[0]] 
for l in lst[1:]: 
    if l[-8:-4] == '0001': 
     lsts.append(buf) 
     buf = [l] 
    else: 
     buf.append(l) 
lsts.append(buf) 
1

要素は常に私のような何かを考え、そのパターンを維持する場合:

prepared_data = ((element, element.split('.')[0].split('_')[-1]) for element in log_files) 
final_logs = [] 
for element in prepared_data: 
    if element[1] == '0001': 
     final_logs.append([element[0]]) 
    else: 
     final_logs[-1].append(element[0]) 
print final_logs 
関連する問題