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

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

ただいまの
回答率

88.35%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 229

konnitiha2

score 22

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

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

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


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

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

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

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

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

adr_dict = dict(zip(month,sales))
dic = sorted(adr_dict.items())

Month = []
Sales = []
for index, i in enumerate(dic):
    Month = month.append(i[index][0])
    Sales = sales.append(i[index][1])

環境
os:windows10
python 3.7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

  • enumerateは今回のケースでは不要です
  • list.appendの返り値は常にNoneなので、取得する必要は無いです
for e in dic:
    month.append(e[0])
    sales.append(e[1])

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

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

コメントを受けて

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

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

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

m_with_s = list(zip(month, sales))
print(m_with_s)

m_with_s = sorted(m_with_s)
print(m_with_s)

month = []
sales = []
for m, s in m_with_s:
    month.append(m)
    sales.append(s)

print(month)
print(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) とするのが効率的です。

おまけ

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

month, sales = map(
    list, zip(
        *sorted(zip(month, sales))
    )
)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/16 16:35

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

    キャンセル

  • 2020/04/16 16:39

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

    キャンセル

  • 2020/04/16 16:45 編集

    追記しました。

    ---
    adr_dict = dict(zip(month,sales))
    dic = sorted(adr_dict.items()) は

    adr_dict = zip(month,sales)
    dic = sorted(adr_dict) にしても今回のケースでは全く問題ないってことです。

    キャンセル

  • 2020/04/16 19:10

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

    キャンセル

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

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る