質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

404閲覧

Python リストからデータを抽出したい2

person

総合スコア224

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/30 04:13

編集2020/10/30 06:02

"*****_name_dateAndNum.csv"
という形式のファイル名のリストがあります。
その内、Numが同じものについては
nameが同じ場合、日時のデータが新しいものを残し、古い方は消します。
(dataは年~分、Numはピリオド前の2桁の数字)

Python

1# 元データ 2files = [ 3 "AAA_A01_20201030040000.csv", # <--- Numが00だがA01は1つしかないので残す 4 "AAB_A02_20201030040001.csv", # <--- Numが01でA02は2つあるので、日時が古いこのデータは消す 5 "CBA_A02_20201030041001.csv", # <--- Numが01でA02は2つあるので、日時が新しいこのデータは残す 6 "DD0_A03_20201030040000.csv", # <--- Numが00だがA03は1つしかないので残す 7 "DD0_A03_20201030040002.csv" # <--- Numが02のものは1つしかないので残す 8]

Python

1# 処理後 2files = [ 3 "AAA_A01_20201030040000.csv", 4 "CBA_A02_20201030041001.csv", 5 "DD0_A03_20201030040000.csv", 6 "DD0_A03_20201030040002.csv" 7]

前回の質問の回答にありましたpandasを使えば実現は可能かもしれませんが、
使い方が分からず実装が出来ません。

自分の方ではpandasを使えないので、使わずにできるかどうかを試しました。
無理でしたが・・・。

Python

1files = [ 2 "AAA_A01_20201030040000.csv", 3 "AAB_A02_20201030040001.csv", 4 "CBA_A02_20201030041001.csv", 5 "DD0_A03_20201030040000.csv", 6 "DD0_A03_20201030040002.csv" 7] 8 9# 案 10# リストをコピーしておいて、不要と判断した部分をリストから削除 11# (空のリストに必要と判断した部分を追加してもいい) 12# 問題は、「不要(または必要)と判断する」という部分がわからない 13 14backup = files 15 16# 消すやつを控えておく 17delete = [] 18 19for i in range(len(files)): 20 for j in range(len(backup)): 21 # Numが一致しているか 22 if files[i][-6:-4] == backup[j][-6:-4]: 23 # nameが一致しているか 24 tmp1 = files[i].split("_") 25 tmp2 = backup[j].split("_") 26 if tmp1[1] == tmp2[1]: 27 # 時間が古いなら削除候補に追加 28 if tmp1[2][0:12] > tmp2[2][0:12]: 29 delete.append(backup[j]) 30 31for i in range(len(delete)): 32 # 削除候補のデータが含まれていれば消す 33 if delete[i] in backup: 34 backup.pop(backup.index(delete[i])) 35 36# このbackupに対象データのみを入れたい 37print(backup)

回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jeanbiego

2020/10/30 05:19

データだけ載せて「お願いします」では丸投げととられますよ。 前回の質問での回答がわからないのでしたら、そのわからなかった部分を質問として書くなどしたほうが、有用な回答がつくと思います。
kirara0048

2020/10/30 06:37

単純なリストかつ中が文字列なのでpandasを使う必要はないと思います。 リスト内を順番に見ていって必要不必要を判断する方法か、リスト自体を名前でソートしたのちに時間の新しいものをとっていく方法があると思います。リスト内のファイル名の順番は維持したいのでしょうか?
guest

回答1

0

ベストアンサー

順不同の場合の例です。

python

1files = [ 2 "AAA_A01_20201030040000.csv", 3 "AAB_A02_20201030040001.csv", 4 "CBA_A02_20201030041001.csv", 5 "DD0_A03_20201030040000.csv", 6 "DD0_A03_20201030040002.csv" 7] 8 9 10{(filename.split('_')[1], filename.split('_')[2][12:14]): filename for filename in sorted(files, key=lambda l: l.split('_')[2][:12])} 11# {('A01', '00'): 'AAA_A01_20201030040000.csv', 12# ('A02', '01'): 'CBA_A02_20201030041001.csv', 13# ('A03', '00'): 'DD0_A03_20201030040000.csv', 14# ('A03', '02'): 'DD0_A03_20201030040002.csv'}

まずsorted(files, key=lambda l: l.split('_')[2][:12])の部分でリストの中身を時刻順に並び替えています。

つづいてそれをfor文で回して、(filename.split('_')[1], filename.split('_')[2][12:14])つまり「(name, Num)」をキー、ファイル名を値とする辞書に変換します。
辞書は同じキーを複数持つことが出来ないため、「(name, Num)」が同じファイル名は後ろにあるもののみが辞書に格納されます。すでに時刻順でソートしてあるので、時刻が新しいもののみが残ります。

この辞書の値が求めるリストになります。(なお辞書の値は.values()メソッドで取得できます)

投稿2020/10/30 07:17

kirara0048

総合スコア1399

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問