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

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

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

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

938閲覧

リストループ処理で要素名を変更したい

mn.py

総合スコア41

Python 3.x

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/05/27 06:14

編集2020/05/28 01:48

blistを、並びを変えずにadictのvalueの2つ目の要素['年齢','地域','回答日時']に書き換えたいです。
そして、最終的に
[['年齢','回答日時','地域'],['20','20200401','大阪'],['30','20200402','東京'],['40','20200409','名古屋']]

この様なリストにしたいです。(実際は各リストに1000ほどの要素が入ったデータになります)

python3

1adict={('AGE', '1'): ['N', '年齢'], 2('ANSWERDATE', '1'): ['D', '回答日時'], 3('AREA', '1'): ['SA', '地域']} 4 5blist=['AGE','AREA','ANSWERDATA'] 6clist=[['20','20200401','大阪'],['30','20200402','東京'],['40','20200409','名古屋']] 7 8elist=[] 9zlist=[] 10for k,i in adict.items(): 11 elist.append(i[1]) 12 for ii in blist: 13 if ii==k[0]: 14 plist=[] 15 for iii in clist: 16 #print(iii[1]) 17 plist.append(iii) 18 19zlist=[elist,plist] 20print(zlist) 21

とすると
[['年齢', '地域', '回答日時'], [['20', '20200401', '大阪'], ['30', '20200402', '東京'], ['40', '20200409', '名古屋']]]
となってしまい、順番が変わってしまいます。また、リストもblistとclistに別れてしまっています。
初心者ゆえ、簡単すぎる質問になっているかもしれませんが、よろしくお願いいたします。

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

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

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

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

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

x98000

2020/05/27 06:43

ソースコードに blistやclistは入っていません。説明と合わないと判断出来ませんよ。
ForestSeo

2020/05/27 08:00

最初の上のコードもMarkdownのコードで書いてください。
x98000

2020/05/27 13:59

やはりよくわかりません。 > blistを、並びを変えずにadictのvalueの2つ目の要素['年齢','地域','回答日時']に書き換えたいです。 blistを書き換えたいとのことですが、コードはblistを書き換えるようにはなっていません。 > 最終的に [['年齢','地域','回答日時'],['20','20200401','大阪'],['30','20200402','東京'],['40','20200409','名古屋']] この様なリストにしたいです。 単純に上記の['年齢','地域','回答日時']とclistを繋げただけのように見えますが、仕様は合ってますか? また、「リストもblistとclistに別れてしまっています」と書かれていますが、blistとclistは入力データでは?
guest

回答1

0

ベストアンサー

とりあえず、すべての処理を一気に行おうとせず、問題を3つに分けましょう。

  1. adictへのキー登録順にclistの要素が並んでいるので、blistの名称順に並び替える。
  2. adictのキーに対応する値に、blistの名称を置換する。
    1. と 1. のリストを連結する。

まず、adictから元の列名の配列を作ります。clistはこの配列の順にデータが並んでいるはずです。
(バージョン3.7以上でないとdictは追加順を保持しません。なので本処理も3.7以上なのを前提で進めます)
次に、元列名の配列から1つずつ列名を取り出し、その列名がblistの何番目に入っているか探します。
AGEが0番目、ANSWERDATEが2番目、AREAが1番目になるはず。
それがわかれば、新しいclistの配列を作り、上の順番で元clistの値を入れてやればよいということです。
次に、blistの名称を日本語に置換する処理。
最初と同じようにadictの値側の配列を作ります。最初に作った列名の配列と順番が対応しています。
あとはclistでやったのと同じように、列名リストの英名とblistの英名が一致するのが何番目か探し、そこに日本語の値を上書きしてやればよいです。
最後に上の処理で作った新しいclistの先頭に新しいblistを挿入して完成です。

python

1adict={('AGE', '1'): ['N', '年齢'], 2('ANSWERDATE', '1'): ['D', '回答日時'], 3('AREA', '1'): ['SA', '地域']} 4 5blist=['AGE','AREA','ANSWERDATE'] 6clist=[['20','20200401','大阪'],['30','20200402','東京'],['40','20200409','名古屋']] 7 8# adictのキーリストを作成 9akeylist = [] 10for (s,v) in list(adict.keys()): 11 akeylist.append(s) 12# 1.clistの並び替え 13# 元clistはakeylistの順に要素が並んでいる 14# それを取り出し、新しい配列を作りblistのキー名が入っている位置に押し込む 15new_clist = [] 16for cdata in clist: 17 new_cdata = ['' for _ in range(len(cdata))] # 同じ要素数の新しい空の配列 18 for ci in range(len(cdata)): 19 value = cdata[ci] # 中身 20 name = akeylist[ci] # 列名 21 newpos = blist.index(name) # 列名からblistのインデックスを取得 22 new_cdata[newpos] = value # 取得したインデックス番地へ代入 23 new_clist.append(new_cdata) # 新しいclistへ投入 24 25# 2.blistの名前置換 26new_blist = blist.copy() 27# 列名を探した時と同じ要領で置換する 28for (k,v) in list(adict.items()): 29 (k1,_) = k #'AGE'とか側 30 (_,v1) = v #'年齢'とか側 31 newpos = new_blist.index(k1) 32 new_blist[newpos] = v1 33 34# 3.新clistの先頭に新blistを挿入して完了 35new_clist.insert(0,new_blist) 36new_clist

投稿2020/05/27 13:43

hope_mucci

総合スコア4447

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

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

mn.py

2020/05/28 01:50

ありがとうございます!かなりこんがらがってしまっていたので、、、今からトライしてみます!上手くいったらまたコメントしに来ます!
mn.py

2020/05/28 14:48

遅くなりました。 写経しつつ調べながらできました。ありがとうございました。 教えていただきたい事があるのですが、 下記のコード部分の(k,v)は()で囲む意味はどの様なものなのでしょうか? また、変数を(k1,_)(_,v1)とされているのはどうしてなのでしょうか?,_は視覚的に右側だとわかりやすくする為でしょうか?()にも意味がありますでしょうか、、?調べてはみたのですが、わかりませんでした。お手数ですがご教授いただけるとありがたいです。重ね重ねすみません。 for (k,v) in list(adict.items()): (k1,_) = k #'AGE'とか側 (_,v1) = v #'年齢'とか側 newpos = new_blist.index(k1) new_blist[newpos] = v1
hope_mucci

2020/05/29 00:44

> 下記のコード部分の(k,v)は()で囲む意味はどの様なものなのでしょうか? items()の内容をタプル(k,v)に代入している処理ですが、文法上は丸カッコは必要ありません。カンマで要素をつなげばタプルになります。が、構文の構造上丸カッコが必要な場合もあります。(x+1)*yをx+1*yと書けないような場面もあります。 私はタプルとして代入していることをわかりやすく強調するためと、別の理由でカッコをつけなければいけない場面で混乱しないように、と常時つけています。 > 変数を(k1,_)(_,v1) pythonは処理上代入が必要だけど使用しない変数としてアンダースコア1文字の変数に代入する習慣があります。処理に使わないと明示するためのものです。 どちらの話もソースの見た目だけの話でどうでもいいことなのですが、他者のソースを読み込む際に参考にしてください。
mn.py

2020/05/29 13:58

ありがとうございます!変数のネーミングは確かに統一感ある方がスッキリしますね^^参考にしたいと思います。 本チャンのデータがややこしくって、応用するのにまだ苦戦していますがとても参考になりました!ありがとうございました。またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問