当方の環境 python 3.10 win10 IDLE
#table型list新規作成方法で、
#先に入れ物用listを作って、代入で入れる方が楽だと
# [['', 0], ['', 0], ['', 0]] 型のlistを作って、
#データを入れ込んだら、listの作り方違いで異なる代入結果に。
#なぜこんなことが起こる? 下記で....は位置合わせ用です。
c = ["a", "b","c"]
d = [ 1 , 2 , 3 ]
print("----テーブル用list枠作り その1 ------")
a = []
for i in range(0,3):
....b = ["",0] #毎回listを定義してみた
....a.append(b)
print(a) #[['', 0], ['', 0], ['', 0]] 枠組ができた
for i in range(0,3): #データ代入
....a[i][0]=c[i]
....a[i][1]=d[i]
print(a) #[['a', 1], ['b', 2], ['c', 3]] 組み合わせ成功
print("----テーブル用list枠作り その2 ------")
a = []
b = ["",0] #事前にappend用listを作成
for i in range(0,3):
....a.append(b)
print(a) #[['', 0], ['', 0], ['', 0]] 同じ枠組ができた
for i in range(0,3): #データ代入
....a[i][0]=c[i]
....a[i][1]=d[i]
print(a) #[['c', 3], ['c', 3], ['c', 3]] あれれ、変な組み合わせだぞ
No.7
- 回答日時:
>a.extend(zipl(cc, dd))
失礼。リストのリストが必須ならzipではできませんね。
今回の目的は、名リストと数字のリストを作り、組み合わせて(名,数字)リストを、作成することが目的でしたが、貴兄のアドバイスで読みやすく簡潔に作成できました。
ご指導、ありがとうございます。
イメージは
bunya = ["a", "b", "c"]
kensu= [70,90,65]
matome = list(zip(bunya, bunya))
print(matome) #結果 [('a', 70), ('b', 90), ('c', 65)]
わずか1行で結合リスト作れました。
python 恐るべし。
No.6
- 回答日時:
>[a.append([c,d]) for c, d in zip_longest(cc, dd)]
これはzipで固めて、forで解いてまた固めてでもったいない。
aに追加するイメージなら
from itertools import zip_longest as zipl
:
:
a.extend(zipl(cc, dd))
そうですね。最初に使えないかなと思ったけど、参考例文には
printしかなかったので、list作成には難しいかなと思ったけど、
チャレンジしたら成功しました。
from itertools import zip_longest
cc = ["a", "b","c"]
dd = [ 1 , 2 , 3 ]
a = []
[a.append([c,d]) for c, d in zip_longest(cc, dd)]
print(a) #[['a', 1], ['b', 2], ['c', 3]]
リスト内包表記って、簡潔ですごいことができますね。
No.4
- 回答日時:
蛇足。
私ならこうかきます。a=[]
for i in range(3):
a.append([c[i], d[i]])
それでうまくいくことを確認できました。
pythonって、簡潔に書けるところが素晴らしい。
次の貴兄の蛇足へのお礼で書いたけど、
リスト内包表記だと、件数知らなくても、リスト作成が1行で書けました。
cc = ["a", "b","c"]
dd = [ 1 , 2 , 3 ]
a = []
[a.append([c,d]) for c, d in zip_longest(cc, dd)]
No.3
- 回答日時:
解決策
①a.append(b[:]) を用いる。
この書き方だと bの shallow copyが作られ、aに追加される。
②
import copy
:
:
a.append(copy.copy(b))
を用いる。効果は①と同じだが、コードがわかりやすい。
因みに質問の内容では、bのshallow copyをaに追加するだけ
で充分。
bは配列要素にimmutableな(書き換え不能な)オブジェクトしか
含まないので、deep Copyは不要。
No.2
- 回答日時:
b(の指す配列)は一個しかないってわかってます?
for i in range(0,3):
....a.append(b)
は「同じ」配列bをaの3つの配列要素としてる。
3つの配列要素は同じオブジェクトだから
どの要素の中味を変更しても、aからみて
3つの要素に「見える」各配列要素は
同時に変化する「ように見える」
aにbをappendする時、bの指す配列のコピーが作られるわけじゃない。
b(配列への参照)がそのままaに格納されることに注意。
pythonでは変数に値の実体が格納されることは無く
格納されるのは参照だけ。
pythonのデータはJavaやC#の参照型と同様の扱いが必要です。
なるほど!
なーーーーるほど!!!
1.事前に一つ作成したb=["",0]を入れ込んだa=[b,b,b]のbは、
2.for i in range(0,3)ループで、毎回、新規に定義したb=["",0]とは
異なるんですね。
1で、最後にbに代入したものを表示してると。
ちなみに、それぞれのbのidをプリントしたら
1 の b のid 全て同じ
2 の b のid 全て異なる
ご教示いただき、ありがとうございます。
No.1
- 回答日時:
「深いコピー(deep copy)」と「浅いコピー(shallow copy)」の違いを理解しましょう。
早速の回答、ありがとうございます。
入門中ですべてが新鮮で新しい言葉ばかりです。
新しい概念を知ることができました。感謝!
代入(assignment)と、copyメソッドによる浅いコピー、深いコピーの違いという概念は、初めてです。(でもよく解らない(-_-;)
今回、私が行った listへのappend()は、どれに相当するのでしょう?
さらに作成したlistの要素一つ一つへ、別のデータを代入する操作はコピーでしょうか?
なんだか、よくわかりません(-_-;)
データ入れ物用のlistは、
a=[] に b=["", 0] を3個をappendで入れ込んだので
a= [b,b,b]=[["", 0],["", 0],["", 0]]
です。
これにデータを入れ込んだのです。
なお、一つのプログラムで2種類が原因かもと、下側(下記)だけにしても結果は変わりません。
まるで for i in range(0,3) の
0,1,2と変わるはずの c[i]やd[i] じゃなく
c[2]とd[2]固定値を代入のようです。
c = ["a", "b","c"]
d = [ 1 , 2 , 3 ]
a = []
b = ["",0] #事前にappend用listを作成
for i in range(0,3):
....a.append(b)
print(a) #[['', 0], ['', 0], ['', 0]] 同じ枠組ができた
for i in range(0,3): #データ代入
....a[i][0]=c[i]
....a[i][1]=d[i]
print(a) #[['c', 3], ['c', 3], ['c', 3]] あれれ、変な組み合わせだぞ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- その他(プログラミング・Web制作) パイソンのプログラムで continue と passの違い 3 2022/03/25 07:38
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
多元配列の0初期化
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
number 改行が追加できない
-
エクセルシート名の制限を変更...
-
ビットスワップとバイトスワッ...
-
バイナリとBCDコード
-
memcmp バイナリデータの比較方法
-
char str[256]の256の意味は?
-
DataGridViewの特定列に入力さ...
-
Javaで日本語1文字のバイト数
-
Excel VBA メール作成について ...
-
機種依存文字をチェックしたい。
-
3バイト文字(UTF-8)をprintfで...
-
unicode←→JISコード
-
ビットからバイトへの変換
-
2byte文字の判定
-
データの値の近いものをグルー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonにCでのexternはありますか
-
python 3.10で 同じlistに同じ...
-
CSVから構造体へ代入
-
VBScriptでカレントディレクト...
-
マクロの書き換え箇所がわかり...
-
Perlで変数中のエスケープされ...
-
UWSCにおける変数の扱い方
-
VB2010での連立方程式の計算
-
なぜかわかりませんscanf()の戻...
-
c言語 グローバル変数
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
stable diffusionのエラー
-
COBOLのCOMP形式について
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
おすすめ情報
最も簡潔な表現で、2つのリストを関連付けられますね。
美しい!
ただ、残念ながら内容見ようとprintすると下記のidを表示
print(a) #<zip object at 0x0000020F6F2ADA80>
で、リスト内容を見るためには、 for i 文 などで分解必要。
zip関数とlist関数は import不要で使えました。
結合後は、元のリストのデータがタプルのセットになり、そのリストになっていました。
リストの結合が、簡単にでき驚きました。
cc = ["a", "b","c"]
dd = [ 1 , 2 , 3 ]
a = list(zip(cc,dd))
print(type(a)) #<class 'list'>
print(a) #[('a', 1), ('b', 2), ('c', 3)] ※できたのは、tuple のリストでした
なお、各リストのidは全て別々。
関数zipとlist紹介サイト
【Python】zip 複数のリスト型から1つのリスト型を作る
https://pg-chain.com/python-list-zip