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

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

ただいまの
回答率

91.35%

  • Python

    3828questions

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

Pythonのfor文でzipを用いてリストの作成

解決済

回答 3

投稿 2017/11/29 16:46

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

asoaso

score 11

sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe  = [], [], [], [], [], []
spe_list = [sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe]

a = [264613.12723114301, 213530.38763031978, 163810.61130664896, 136871.05704474563, 116101.8574003962, 94862.205318461289, 76882.988823338295, 64967.385627235752, 56649.812648108447, 235490.94770532235, 223653.85964166056, 171781.0752035192, 143659.12178123076, 121747.11404648534, 99414.953211499684, 80205.550783447776, 67749.520142203764, 58972.704983976939, 258968.2505837474, 199318.79810241674, 153318.88851751294, 128140.27967669716, 108742.10307887496, 88866.712291087097, 71950.44413915115, 60982.057699482684, 52960.99886607263, 613638.79095825891, 583022.1346845167, 447659.34633396397, 374373.33102659252, 317155.96087360661, 258911.54298057302, 209115.76781486484, 176587.5132472465, 153429.55672548222, 694138.44600377022, 534840.02950766473, 410845.64037928835, 343736.22689563455, 291540.03973971767, 238380.26147863301, 192970.63366398562, 163485.75761805839, 142077.4040784016, 695474.49894273863, 535824.57435067231, 411609.46646169998, 344390.54762963147, 292077.40171641973, 238831.97944460437, 193331.39981859887, 163791.7886542324, 142344.17486671402]

for i, spe in zip(range(0, 6), spe_list):
    spe = a[i:i+9]

print(aso01_spe)


このように空のリストを6つ用意し、それをまたリストにしてaをそれぞれ6つのリストに9個ずつ値を代入していきたいと考えています。

しかし、実行してみると値は代入されておらず空のリストのままでした。
どこに問題があると考えられますか。

よろしくおねがいします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+3

spe += a[i:i+9]


補足
pythonでポインタっぽいことをやろうと思ったら、結構繊細です。
spe = a[i:i+9]
というのは
speの指す場所をaso01_speからa[i:i+9]に変更しています。
なので、aso01_speは[]のまま変更されません。
一方で、
spe += a[i:i+9]
をすると、まずspeはaso01_speであり、それにa[i:i+9]を追加します。
ゆえにaso01_speの中身にa[i:i+9]が加わります。


追記:idを見てみる

sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe  = [], [], [], [], [], []
spe_list = [sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe]
print(id(aso01_spe))
#4321501320

a = [264613.12723114301, 213530.38763031978, 163810.61130664896, 136871.05704474563, 116101.8574003962, 94862.205318461289, 76882.988823338295, 64967.385627235752, 56649.812648108447, 235490.94770532235, 223653.85964166056, 171781.0752035192, 143659.12178123076, 121747.11404648534, 99414.953211499684, 80205.550783447776, 67749.520142203764, 58972.704983976939, 258968.2505837474, 199318.79810241674, 153318.88851751294, 128140.27967669716, 108742.10307887496, 88866.712291087097, 71950.44413915115, 60982.057699482684, 52960.99886607263, 613638.79095825891, 583022.1346845167, 447659.34633396397, 374373.33102659252, 317155.96087360661, 258911.54298057302, 209115.76781486484, 176587.5132472465, 153429.55672548222, 694138.44600377022, 534840.02950766473, 410845.64037928835, 343736.22689563455, 291540.03973971767, 238380.26147863301, 192970.63366398562, 163485.75761805839, 142077.4040784016, 695474.49894273863, 535824.57435067231, 411609.46646169998, 344390.54762963147, 292077.40171641973, 238831.97944460437, 193331.39981859887, 163791.7886542324, 142344.17486671402]

for i, spe in zip(range(0, 6), spe_list):
    print(i)
    print(id(spe))
    spe += a[i:i+9]
    print(id(spe))
'''
0
4321492936
4321492936
1
4321503112
4321503112
2
4321502728
4321502728
3
4321501320
4321501320
4
4321502792
4321502792
5
4321593800
4321593800
'''

print(aso01_spe)
#[136871.05704474563, 116101.8574003962, 94862.20531846129, 76882.9888233383, 64967.38562723575, 56649.81264810845, 235490.94770532235, 223653.85964166056, 171781.0752035192]
print(id(aso01_spe))
#4321501320
sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe  = [], [], [], [], [], []
spe_list = [sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe]
print(id(aso01_spe))
#4320514184

a = [264613.12723114301, 213530.38763031978, 163810.61130664896, 136871.05704474563, 116101.8574003962, 94862.205318461289, 76882.988823338295, 64967.385627235752, 56649.812648108447, 235490.94770532235, 223653.85964166056, 171781.0752035192, 143659.12178123076, 121747.11404648534, 99414.953211499684, 80205.550783447776, 67749.520142203764, 58972.704983976939, 258968.2505837474, 199318.79810241674, 153318.88851751294, 128140.27967669716, 108742.10307887496, 88866.712291087097, 71950.44413915115, 60982.057699482684, 52960.99886607263, 613638.79095825891, 583022.1346845167, 447659.34633396397, 374373.33102659252, 317155.96087360661, 258911.54298057302, 209115.76781486484, 176587.5132472465, 153429.55672548222, 694138.44600377022, 534840.02950766473, 410845.64037928835, 343736.22689563455, 291540.03973971767, 238380.26147863301, 192970.63366398562, 163485.75761805839, 142077.4040784016, 695474.49894273863, 535824.57435067231, 411609.46646169998, 344390.54762963147, 292077.40171641973, 238831.97944460437, 193331.39981859887, 163791.7886542324, 142344.17486671402]

for i, spe in zip(range(0, 6), spe_list):
    print(i)
    print(id(spe))
    spe = a[i:i+9]
    print(id(spe))
'''
0
4320505800
4320606920
1
4320515976
4320606920
2
4320515592
4320606920
3
4320514184
4320606920
4
4320515656
4320606920
5
4320606664
4320606920
'''
print(aso01_spe)
#[]
print(id(aso01_spe))
#4320514184

投稿 2017/11/29 17:04

編集 2017/11/29 17:28

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/29 17:15

    むむむ=はだめだけど+=ならいけるんですね!

    キャンセル

  • 2017/11/29 17:21

    じっくりコードを読まないと何をしているのかわからないコート出来上がりますが…

    aso01_speに予め何か入っていると、それも受け継がれます。
    用途によってはこれはバグになりえます。

    pythonのlistはmutableなので、慎重に扱わないと大変なことになることがよくあります。
    id関数でチェックすると振る舞いについて理解を深められるかもしれません。
    https://qiita.com/utgwkk/items/5ad2527f19150ae33322

    キャンセル

  • 2017/11/29 17:25

    =は一般の言語と同様、変数への代入をする特別な演算子だと思うのですが、+=は代入オペレーターの一種というよりはもはやlistのメソッドと思った方が自分にはしっくりきました。他の言語の類推で+=を代入だと思ってしまうと痛い目にあいそうです!

    キャンセル

  • 2017/11/29 17:30

    おっしゃるとおりだと思います。
    spe += a[i:i+9]

    spe.extend(a[i:i+9])
    と同じ働きをするかと思います。

    キャンセル

  • 2017/11/29 17:37

    重要な注意点があるとすればnumpy.arrayに対して同じことを行うとベクトルの足し算が実行されることでしょう。
    それを無理やりやろうとして、numpy.arrayからlistへキャストして、要素を追加して、listからnumpy.arrayにキャストし戻すテクニックが想像つきます。

    pythonらしくないコード設計をpythonらしく書くコーナーになっているような。

    多くのライブラリを参考にするとLouiS0616さんの辞書を使った書き方が一番pythonらしい書き方かと思います。

    キャンセル

  • 2017/11/29 17:56

    > 重要な注意点
    numpy.arrayとlistの違いは混乱しがちに思えました(自分はそうでした)。違いがわかると他者のコードが大分把握しやすくなる気がしました。

    キャンセル

+3

原因については指摘がもうあるので、解決案を一つ。

from pprint import pprint

a = [264613.12723114301, 213530.38763031978, 163810.61130664896, 136871.05704474563, 116101.8574003962, 94862.205318461289, 76882.988823338295, 64967.385627235752, 56649.812648108447, 235490.94770532235, 223653.85964166056, 171781.0752035192, 143659.12178123076, 121747.11404648534, 99414.953211499684, 80205.550783447776, 67749.520142203764, 58972.704983976939, 258968.2505837474, 199318.79810241674, 153318.88851751294, 128140.27967669716, 108742.10307887496, 88866.712291087097, 71950.44413915115, 60982.057699482684, 52960.99886607263, 613638.79095825891, 583022.1346845167, 447659.34633396397, 374373.33102659252, 317155.96087360661, 258911.54298057302, 209115.76781486484, 176587.5132472465, 153429.55672548222, 694138.44600377022, 534840.02950766473, 410845.64037928835, 343736.22689563455, 291540.03973971767, 238380.26147863301, 192970.63366398562, 163485.75761805839, 142077.4040784016, 695474.49894273863, 535824.57435067231, 411609.46646169998, 344390.54762963147, 292077.40171641973, 238831.97944460437, 193331.39981859887, 163791.7886542324, 142344.17486671402]
spe_dict = dict(zip(
    ['sensei01_spe', 'sensei02_spe', 'sensei03_spe', 'aso01_spe', 'aso02_spe', 'aso03_spe'],
    (a[i:i+9] for i in range(6))
))

pprint(spe_dict)
print(spe_dict['aso01_spe'])

"""実行結果
{'aso01_spe': [136871.05704474563,
               116101.8574003962,
               94862.20531846129,
               76882.9888233383,
               64967.38562723575,
               56649.81264810845,
               235490.94770532235,
               223653.85964166056,
               171781.0752035192],
 'aso02_spe': [116101.8574003962,
               94862.20531846129,
               76882.9888233383,
               64967.38562723575,
               56649.81264810845,
               235490.94770532235,
               223653.85964166056,
               171781.0752035192,
               143659.12178123076],
 'aso03_spe': [94862.20531846129,
               76882.9888233383,
               64967.38562723575,
               56649.81264810845,
               235490.94770532235,
               223653.85964166056,
               171781.0752035192,
               143659.12178123076,
               121747.11404648534],
 'sensei01_spe': [264613.127231143,
                  213530.38763031978,
                  163810.61130664896,
                  136871.05704474563,
                  116101.8574003962,
                  94862.20531846129,
                  76882.9888233383,
                  64967.38562723575,
                  56649.81264810845],
 'sensei02_spe': [213530.38763031978,
                  163810.61130664896,
                  136871.05704474563,
                  116101.8574003962,
                  94862.20531846129,
                  76882.9888233383,
                  64967.38562723575,
                  56649.81264810845,
                  235490.94770532235],
 'sensei03_spe': [163810.61130664896,
                  136871.05704474563,
                  116101.8574003962,
                  94862.20531846129,
                  76882.9888233383,
                  64967.38562723575,
                  56649.81264810845,
                  235490.94770532235,
                  223653.85964166056]}
[136871.05704474563, 116101.8574003962, 94862.20531846129, 76882.9888233383, 64967.38562723575, 56649.81264810845, 235490.94770532235, 223653.85964166056, 171781.0752035192]
"""

各要素に意味を付けたいのなら、辞書を使うとよいです。

投稿 2017/11/29 17:19

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

なぜうまくいかないかと言えば

a0 = []
a1 = a0
a1 = [1]

この結果a1は[1]になりますがa0は[]のままです。つまり=による代入は「変数が指すオブジェクトを右辺のものに変える」だけであって「元々変数に入っていた値に対して影響するものではない」からです。変数に入っていた値に影響させるには代入文ではなく変数に入っているオブジェクトのメソッドを呼ぶなどしてオブジェクトの構造を変更するようなことをしなければなりません。

例えばこうならできます

a0 = []
a1 = a0
a1.append(1)
print(a0) # => [1]

しかしリストへのappendは1要素ずつしかできません。(もっと便利なメソッドがあるかも知れませんのでそれは探してみてください)もし1要素ずつしか追加できないとするとspeへaの9要素を一度に追記できないのでまたしても内側にループを書かなければならないということになります。しかしそれはPythonらしくないかも知れません。そこでいろいろ考えると先頭行の応用でよさそうな気がします。

a = [ ... ]

#長すぎる行なので継続行にしました。
sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe = \
    [ a[i:i+9] for i in range(0, 54, 9)]

print(aso01_spe)
===>結果
[613638.7909582589, 583022.1346845167, 447659.346333964,
 374373.3310265925, 317155.9608736066, 258911.54298057302,
 209115.76781486484, 176587.5132472465, 153429.55672548222]

投稿 2017/11/29 17:14

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/29 17:16

    > もっと便利なメソッドがあるかも知れません
    それはmkgreiさんコメントの+=だったんですね!

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

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

  • Python

    3828questions

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