アプリ版:「スタンプのみでお礼する」機能のリリースについて

当方の環境 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]] あれれ、変な組み合わせだぞ

質問者からの補足コメント

  • うれしい

    最も簡潔な表現で、2つのリストを関連付けられますね。
    美しい!
    ただ、残念ながら内容見ようとprintすると下記のidを表示
    print(a) #<zip object at 0x0000020F6F2ADA80>
    で、リスト内容を見るためには、 for  i 文 などで分解必要。

    No.5の回答に寄せられた補足コメントです。 補足日時:2022/06/19 07:14
  • HAPPY

    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

      補足日時:2022/06/19 09:17

A 回答 (7件)

蛇足2


a=list(zip(c, d))
この回答への補足あり
    • good
    • 0
この回答へのお礼

そうですね。最初に使えないかなと思ったけど、参考例文には
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]]

リスト内包表記って、簡潔ですごいことができますね。

お礼日時:2022/06/18 22:19

>a.extend(zipl(cc, dd))



失礼。リストのリストが必須ならzipではできませんね。
    • good
    • 0
この回答へのお礼

今回の目的は、名リストと数字のリストを作り、組み合わせて(名,数字)リストを、作成することが目的でしたが、貴兄のアドバイスで読みやすく簡潔に作成できました。
ご指導、ありがとうございます。
イメージは
bunya = ["a", "b", "c"]
kensu= [70,90,65]
matome = list(zip(bunya, bunya))
print(matome)  #結果 [('a', 70), ('b', 90), ('c', 65)]
わずか1行で結合リスト作れました。
python 恐るべし。

お礼日時:2022/06/19 14:24

>[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))
    • good
    • 0

蛇足。

私ならこうかきます。
a=[]
for i in range(3):
a.append([c[i], d[i]])
    • good
    • 0
この回答へのお礼

それでうまくいくことを確認できました。
pythonって、簡潔に書けるところが素晴らしい。

次の貴兄の蛇足へのお礼で書いたけど、
リスト内包表記だと、件数知らなくても、リスト作成が1行で書けました。
cc = ["a", "b","c"]
dd = [ 1 , 2 , 3 ]
a = []
[a.append([c,d]) for c, d in zip_longest(cc, dd)]

お礼日時:2022/06/18 22:25

解決策


①a.append(b[:]) を用いる。
この書き方だと bの shallow copyが作られ、aに追加される。


import copy
:
:
a.append(copy.copy(b))

を用いる。効果は①と同じだが、コードがわかりやすい。

因みに質問の内容では、bのshallow copyをaに追加するだけ
で充分。

bは配列要素にimmutableな(書き換え不能な)オブジェクトしか
含まないので、deep Copyは不要。
    • good
    • 0

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#の参照型と同様の扱いが必要です。
    • good
    • 0
この回答へのお礼

なるほど!
なーーーーるほど!!!

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 全て異なる

ご教示いただき、ありがとうございます。

お礼日時:2022/06/18 20:16

「深いコピー(deep copy)」と「浅いコピー(shallow copy)」の違いを理解しましょう。

    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。
入門中ですべてが新鮮で新しい言葉ばかりです。
新しい概念を知ることができました。感謝!

代入(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]] あれれ、変な組み合わせだぞ

お礼日時:2022/06/18 19:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!