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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

732閲覧

python 辞書の扱い方について

mn.py

総合スコア41

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/04/04 13:49

編集2021/04/07 18:49

やりたい処理

Aの値とOUTのkeyが一致 →→Bにvalueを追加
Aの値とINのkeyが一致 →→Bからvalueと同じ要素を削除
OUT、INともに該当key無し →→更新無し
csvファイルに都度出力

python

1# サンプルデータ 2A=[['10'],['9'],['8'],['7'],['6'],['5'],['4'],['3'],['2'],['1']] 3B=[['a'],['b'],['c'],['d'],['e']]  4IN ={'8':'a','8':'b','2':'e']} 5OUT={'9':'f','2':'g','1':'h'}

イメージ

例)該当keyなし

AB
10a
10b
10c
10d
10e

例)該当keyがOUTにあり

AB
9a
9b
9c
9d
9e
9f

例)該当keyがINにあり

AB
8c
8d
8e
8f

例)該当keyなし

AB
7c
7d
7e
7f

試したこと

python

1import itertools 2import numpy as np 3 4for i,dat in enumerate(A): 5 if dat[0] in OUT: 6 print('追加します',dat[0],OUT[dat[0]]) 7 B.append([OUT[dat[0]]]) 8 print('追B',B) 9 if dat[0] in IN: 10 print('削除します',dat[0],IN[dat[0]]) 11 print(IN[dat[0]]) 12 B.remove([IN[dat[0]]]) 13 print('減',B) 14 else: 15 print('どれも同じじゃない',dat[0]) 16 print('不変',B) 17 18 print(B) 19 np.savetxt(dat[0], B, fmt='%s', delimiter=',')

問題点

該当のkeyが2つ以上存在するときに、一つしか更新できない。
そもそものデータの持ち方を変えたほうが良いのでしょうか?
何かいいやり方などあればアドバイスお願いいたします。

追記

回答いただいたコードの

python

1B = [b for b in B if b not in IN[dat[0]]]

この部分がよく分かりませんでした、、、

python

1for b in B: 2 if b not in IN[dat[0]]: 3 B=b

どの部分で削除しているのでしょうか??お手数おかけいたしますが、教えていただけるとありがたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

データの持ち方を変えたほうが良いのでしょうか?

データを変えないと実現できません。
以下でわかるように辞書は一つのキーには一つしか値を持てないからです。

python

1>>> IN ={'8':'a','8':'b','2':'e'} 2>>> print(IN) 3{'8': 'b', '2': 'e'}

元のコードをなるべく活かすようにすると以下のようになります。

python

1A=[['10'],['9'],['8'],['7'],['6'],['5'],['4'],['3'],['2'],['1']] 2B=[['a'],['b'],['c'],['d'],['e']] 3IN ={'8':[['a'],['b']],'2':[['e']]} 4OUT={'9':[['f']],'2':[['g']],'1':[['h']]} 5 6for i,dat in enumerate(A): 7 if dat[0] in OUT: 8 print('追加します',dat[0],OUT[dat[0]]) 9 B.extend(OUT[dat[0]]) 10 print('追B',B) 11 if dat[0] in IN: 12 print('削除します',dat[0],IN[dat[0]]) 13 print(IN[dat[0]]) 14 B = [b for b in B if b not in IN[dat[0]]] 15 print('減',B) 16 else: 17 print('どれも同じじゃない',dat[0]) 18 print('不変',B)

実行結果です。

python

1どれも同じじゃない 10 2不変 [['a'], ['b'], ['c'], ['d'], ['e']] 3追加します 9 [['f']] 4追B [['a'], ['b'], ['c'], ['d'], ['e'], ['f']] 5どれも同じじゃない 9 6不変 [['a'], ['b'], ['c'], ['d'], ['e'], ['f']] 7削除します 8 [['a'], ['b']] 8[['a'], ['b']] 9[['c'], ['d'], ['e'], ['f']] 10どれも同じじゃない 7 11不変 [['c'], ['d'], ['e'], ['f']] 12どれも同じじゃない 6 13不変 [['c'], ['d'], ['e'], ['f']] 14どれも同じじゃない 5 15不変 [['c'], ['d'], ['e'], ['f']] 16どれも同じじゃない 4 17不変 [['c'], ['d'], ['e'], ['f']] 18どれも同じじゃない 3 19不変 [['c'], ['d'], ['e'], ['f']] 20追加します 2 [['g']] 21追B [['c'], ['d'], ['e'], ['f'], ['g']] 22削除します 2 [['e']] 23[['e']] 24[['c'], ['d'], ['f'], ['g']] 25追加します 1 [['h']] 26追B [['c'], ['d'], ['f'], ['g'], ['h']] 27どれも同じじゃない 1 28不変 [['c'], ['d'], ['f'], ['g'], ['h']]

iを使っていないので、enumerateはなくても書けます。
AやOUTがcsvファイルにはいっておらず、自由に変えて良いならもう少し簡単になります。
ファイルからの読み込みと書込みにnp.savetxtなどを使わなくて良ければさらに簡単になります。

投稿2021/04/04 23:01

ppaul

総合スコア24670

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

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

mn.py

2021/04/05 22:34

ありがとうございます。OUTとIN元データは日付と価格が2列に格納されたcsv、Aは日付列のみのcsvなので、dataからの取り出しを変えてみます。enumerateを使っていたのは、この処理の後に一日日付をずらしたいと考えていたので使用していました。np.savetxtは使わなくてもOKです。参考にしたコードで使用されていたので使っていました。
mn.py

2021/04/07 18:45

追記したので、よかったら教えていただけるとありがたいです。
mn.py

2021/04/07 18:57

for b in B: if b not in IN[dat[0]]: result.append(item) すみません!取り除く、という処理だったのですね! めちゃくちゃ勉強になりました! ありがとうございました。またよろしくお願いします! #for item in mylist: # if item != target: # result.append(item) #B = result
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問