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

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

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

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

Q&A

解決済

3回答

1024閲覧

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

gymgym

総合スコア97

Python

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

0グッド

1クリップ

投稿2017/11/29 07:46

Python

1sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe = [], [], [], [], [], [] 2spe_list = [sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe] 3 4a = [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] 5 6for i, spe in zip(range(0, 6), spe_list): 7 spe = a[i:i+9] 8 9print(aso01_spe)

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

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

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

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

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

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

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

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

guest

回答3

0

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

Python

1from pprint import pprint 2 3a = [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] 4spe_dict = dict(zip( 5 ['sensei01_spe', 'sensei02_spe', 'sensei03_spe', 'aso01_spe', 'aso02_spe', 'aso03_spe'], 6 (a[i:i+9] for i in range(6)) 7)) 8 9pprint(spe_dict) 10print(spe_dict['aso01_spe']) 11 12"""実行結果 13{'aso01_spe': [136871.05704474563, 14 116101.8574003962, 15 94862.20531846129, 16 76882.9888233383, 17 64967.38562723575, 18 56649.81264810845, 19 235490.94770532235, 20 223653.85964166056, 21 171781.0752035192], 22 'aso02_spe': [116101.8574003962, 23 94862.20531846129, 24 76882.9888233383, 25 64967.38562723575, 26 56649.81264810845, 27 235490.94770532235, 28 223653.85964166056, 29 171781.0752035192, 30 143659.12178123076], 31 'aso03_spe': [94862.20531846129, 32 76882.9888233383, 33 64967.38562723575, 34 56649.81264810845, 35 235490.94770532235, 36 223653.85964166056, 37 171781.0752035192, 38 143659.12178123076, 39 121747.11404648534], 40 'sensei01_spe': [264613.127231143, 41 213530.38763031978, 42 163810.61130664896, 43 136871.05704474563, 44 116101.8574003962, 45 94862.20531846129, 46 76882.9888233383, 47 64967.38562723575, 48 56649.81264810845], 49 'sensei02_spe': [213530.38763031978, 50 163810.61130664896, 51 136871.05704474563, 52 116101.8574003962, 53 94862.20531846129, 54 76882.9888233383, 55 64967.38562723575, 56 56649.81264810845, 57 235490.94770532235], 58 'sensei03_spe': [163810.61130664896, 59 136871.05704474563, 60 116101.8574003962, 61 94862.20531846129, 62 76882.9888233383, 63 64967.38562723575, 64 56649.81264810845, 65 235490.94770532235, 66 223653.85964166056]} 67[136871.05704474563, 116101.8574003962, 94862.20531846129, 76882.9888233383, 64967.38562723575, 56649.81264810845, 235490.94770532235, 223653.85964166056, 171781.0752035192] 68"""

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

投稿2017/11/29 08:19

LouiS0616

総合スコア35660

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

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

0

ベストアンサー

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を見てみる

python

1sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe = [], [], [], [], [], [] 2spe_list = [sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe] 3print(id(aso01_spe)) 4#4321501320 5 6a = [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] 7 8for i, spe in zip(range(0, 6), spe_list): 9 print(i) 10 print(id(spe)) 11 spe += a[i:i+9] 12 print(id(spe)) 13''' 140 154321492936 164321492936 171 184321503112 194321503112 202 214321502728 224321502728 233 244321501320 254321501320 264 274321502792 284321502792 295 304321593800 314321593800 32''' 33 34print(aso01_spe) 35#[136871.05704474563, 116101.8574003962, 94862.20531846129, 76882.9888233383, 64967.38562723575, 56649.81264810845, 235490.94770532235, 223653.85964166056, 171781.0752035192] 36print(id(aso01_spe)) 37#4321501320

python

1sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe = [], [], [], [], [], [] 2spe_list = [sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe] 3print(id(aso01_spe)) 4#4320514184 5 6a = [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] 7 8for i, spe in zip(range(0, 6), spe_list): 9 print(i) 10 print(id(spe)) 11 spe = a[i:i+9] 12 print(id(spe)) 13''' 140 154320505800 164320606920 171 184320515976 194320606920 202 214320515592 224320606920 233 244320514184 254320606920 264 274320515656 284320606920 295 304320606664 314320606920 32''' 33print(aso01_spe) 34#[] 35print(id(aso01_spe)) 36#4320514184

投稿2017/11/29 08:04

編集2017/11/29 08:28
mkgrei

総合スコア8560

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

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

KSwordOfHaste

2017/11/29 08:15

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

2017/11/29 08:21

じっくりコードを読まないと何をしているのかわからないコート出来上がりますが… aso01_speに予め何か入っていると、それも受け継がれます。 用途によってはこれはバグになりえます。 pythonのlistはmutableなので、慎重に扱わないと大変なことになることがよくあります。 id関数でチェックすると振る舞いについて理解を深められるかもしれません。 https://qiita.com/utgwkk/items/5ad2527f19150ae33322
KSwordOfHaste

2017/11/29 08:25

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

2017/11/29 08:30

おっしゃるとおりだと思います。 spe += a[i:i+9] は spe.extend(a[i:i+9]) と同じ働きをするかと思います。
mkgrei

2017/11/29 08:37

重要な注意点があるとすればnumpy.arrayに対して同じことを行うとベクトルの足し算が実行されることでしょう。 それを無理やりやろうとして、numpy.arrayからlistへキャストして、要素を追加して、listからnumpy.arrayにキャストし戻すテクニックが想像つきます。 pythonらしくないコード設計をpythonらしく書くコーナーになっているような。 多くのライブラリを参考にするとLouiS0616さんの辞書を使った書き方が一番pythonらしい書き方かと思います。
KSwordOfHaste

2017/11/29 08:56

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

0

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

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

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

例えばこうならできます

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

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

python

1a = [ ... ] 2 3#長すぎる行なので継続行にしました。 4sensei01_spe,sensei02_spe, sensei03_spe, aso01_spe, aso02_spe, aso03_spe = \ 5 [ a[i:i+9] for i in range(0, 54, 9)] 6 7print(aso01_spe) 8===>結果 9[613638.7909582589, 583022.1346845167, 447659.346333964, 10 374373.3310265925, 317155.9608736066, 258911.54298057302, 11 209115.76781486484, 176587.5132472465, 153429.55672548222]

投稿2017/11/29 08:14

KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/11/29 08:16

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問