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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

2回答

442閲覧

リストの並行処理の仕方?

konnitiha2

総合スコア30

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

1クリップ

投稿2020/04/16 07:14

編集2020/04/16 07:21

取り組んでいる課題:入力をリストで受け取り、それをもとに折れ線グラフを作成したいです。

例えば、入力として下記のようなものがあるとします。
monthが月を表し、salesは売り上げを表しているとします。
このままでも折れ線グラフで表すことはできるとは思うのですが、ちゃんと1月から順番に並べ替えたいです。

python

1month = [3, 2, 1, 4, 5, ....] 2sales = [300, 200, 100, 400, 500, ....]

質問:monthを昇順に並べ替えれば1月からにはなるのですが、monthの移動に応じてsalesの中身も変わってほしいのですがどうすればよいでしょうか

質問のイメージとしては、上のリストが下記のリストのようになってほしいです

python

1month = [1, 2, 3, 4, 5, ....] 2sales = [100, 200, 300, 400, 500, ....]

試したこと
下記のようなプログラムで対応しようと考えたが、TypeError: 'int' object is not subscriptable
というエラーが出てしまいました。

python

1month = [2, 3, 1, 4] 2sales = [200, 300, 100, 400] 3 4adr_dict = dict(zip(month,sales)) 5dic = sorted(adr_dict.items()) 6 7Month = [] 8Sales = [] 9for index, i in enumerate(dic): 10 Month = month.append(i[index][0]) 11 Sales = sales.append(i[index][1])

環境
os:windows10
python 3.7

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

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

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

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

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

guest

回答2

0

自己解決

pythonの標準ライブラリであるzipなどを使ってペアを作り、それをsortしていくことで解決できた。

投稿2020/04/16 10:12

konnitiha2

総合スコア30

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

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

0

様々なコードを参考にしているのだと思いますが、ちくはぐなプログラムになってしまっています。
コードの意味をしっかり理解してから応用するのが本来良いでしょう。

  • enumerateは今回のケースでは不要です
  • list.appendの返り値は常にNoneなので、取得する必要は無いです

Python

1for e in dic: 2 month.append(e[0]) 3 sales.append(e[1])

次のようにも書けます。ちょっとだけスマートです。

Python

1for m, s in dic: 2 month.append(m) 3 sales.append(s)

コメントを受けて

やはり一度辞書型にしてsortするしかないのでしょうか

辞書に限らず何らかの方法でオブジェクトの組を作れば良いです。

Python

1month = [2, 3, 1, 4] 2sales = [200, 300, 100, 400] 3 4m_with_s = list(zip(month, sales)) 5print(m_with_s) 6 7m_with_s = sorted(m_with_s) 8print(m_with_s) 9 10month = [] 11sales = [] 12for m, s in m_with_s: 13 month.append(m) 14 sales.append(s) 15 16print(month) 17print(sales)

実行結果 Wandbox

[(2, 200), (3, 300), (1, 100), (4, 400)] [(1, 100), (2, 200), (3, 300), (4, 400)] [1, 2, 3, 4] [100, 200, 300, 400]

尚 m_with_s = list(zip(month, sales)) とリストに変換しているのはトレースの為で、
イテレータをそのまま使って m_with_s = zip(month, sales) とするのが効率的です。

おまけ

次のように書けば実質一行で実現できますが、少々分かりづらいのが難点です。

Python

1month, sales = map( 2 list, zip( 3 *sorted(zip(month, sales)) 4 ) 5)

投稿2020/04/16 07:24

編集2020/04/16 07:44
LouiS0616

総合スコア35660

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

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

konnitiha2

2020/04/16 07:35

回答ありがとうございます 恥ずかしいミスをしてしまいました... 追加で質問させていただきたいのですが、やはり一度辞書型にしてsortするしかないのでしょうか おまけで書いてくださったプログラムなら辞書型に変更せずにsortできているのでしょうか
LouiS0616

2020/04/16 07:39

辞書にしなくても、何らかの方法でオブジェクトの組を作ればソートできますよ。 追記するのでちょっとお待ち下さい。
LouiS0616

2020/04/16 07:47 編集

追記しました。 --- adr_dict = dict(zip(month,sales)) dic = sorted(adr_dict.items()) は adr_dict = zip(month,sales) dic = sorted(adr_dict) にしても今回のケースでは全く問題ないってことです。
konnitiha2

2020/04/16 10:10

理解しました! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問