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

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

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

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

Q&A

解決済

2回答

1583閲覧

Python 二重[]をリスト内包表記で[]にしたい

nomaluu

総合スコア34

Python

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

0グッド

0クリップ

投稿2021/09/19 14:36

編集2021/09/19 15:49

__https://atcoder.jp/contests/abc128/tasks/abc128_c__の問題において途中ですが以下のコードを書いたのですが、実行すると

[[1, 2, 2]]

となり「」といった、[]を外す方法がないかや、また「」の場合どこに置けばいいかご教授お願い致します。
[追加編集]
『また「*」の場合どこに置けばいいかご教授お願い致します。』についてですが、

*print(swt)

以外でお願い致します。

python

1n,m = map(int,input().split()) 2swt= [list(map(int,input().split()))[1:] for lit in range(m)] 3swt = [swt[0] + swt[idx] for idx in range(m) if idx!=0] 4print(swt)#確認用

[入力]
2 2
2 1 2
1 2

[出力]
[[1, 2, 2]]

[追加編集]
リスト内包表記ではないのですが、やりたいことは以下のコードのような感じです。

python

1n,m = map(int,input().split()) 2swt= [list(map(int,input().split()))[1:] for lit in range(m)] 3swt = [swt[0] + swt[idx] for idx in range(m) if idx!=0] 4 5print(*swt)

[入力]
2 2
2 1 2
1 2

[出力]
[1, 2, 2]

環境

vscode
windows10
python3.9.5

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

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

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

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

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

ppaul

2021/09/19 15:19

入力が、[[1, 2], [2]]のとき、[1, 2, 2]を出力するような処理が欲しいという質問ですか?
nomaluu

2021/09/19 15:51 編集

すいません。リスト内包表記でしたいのは[[1, 2, 2]]です。 修正します 「編集しました」 [1, 2, 2]から[[1, 2, 2]]に訂正
ppaul

2021/09/19 15:59

ご質問が理解できません。 入力が[[1, 2, 2]]で出力が[1, 2, 2]なら、 >>> swt = [[1, 2, 2]] >>> print(swt[0]) [1, 2, 2] ですが、そういうご質問ではないような気がします。
quickquip

2021/09/19 23:00

m=3 の時の、データの例と欲しいものの例もあるとよさそうです。
nomaluu

2021/09/20 05:48

[入力]ではいけないのでしょうか。
nomaluu

2021/09/20 05:56

上のコードの[[1, 2, 2]]をリスト内包表記で[1, 2, 2]にしたいという質問をさせていただいております。
quickquip

2021/09/20 07:08 編集

> リスト内包表記で XY問題の典型的なパターンです。 https://ja.wikipedia.org/wiki/XY%E5%95%8F%E9%A1%8C https://ja.meta.stackoverflow.com/questions/2701#answer-2702 単純に見ると swt = swt[0] でいいはずなのに、なぜ「リスト内包表記で」と言っているのかその意図がわからないです。 ppaulさんの"そういうご質問ではないような気がします"に同意で、私も"どうもそういうことではないらしい"がしかし"それはなんだろう?"と思いました。 ついでに今書いてあるコードの意図もわかってなくて(それはちゃんと考えてないからでもあるんですが)、だとしたらもしかして m=3 の時に swt = swt[0] ではいけない理由が出てくるのかな? と想像したのでした。
actorbug

2021/09/21 20:37

2 3 2 1 2 1 1 1 2 という入力が与えられた場合に、swtがどのような値になってほしいのでしょうか? [1,2,1]ですか? [1,2,1,1,2,2]ですか? それ以外ですか?
nomaluu

2021/09/23 12:49

上のコードで実行して出力される[[1, 2, 1], [1, 2, 2]]の外枠の[]を [1, 2, 1] [1, 2, 2]のように外したいです。 その外す行為をリスト内包表記でしたいという質問をさせていただいております。なぜ、リスト内包表記でしたいのかというと、print(*swt)ではなく、外した状態で変数swtとして使いたいからです。
quickquip

2021/09/23 15:33 編集

質問者さん「墨汁を使うとなぜか黒く塗られてしまって困っています。私は朱色に塗りたいんですが墨汁を使って朱色に塗るにはどうしたらいいんでしょうか?」 いろんな人たち「それは"墨汁を使う"という手段の選択を間違えているか、"朱色に塗る"という目的の方になにか勘違いがあるんじゃないですか?」 質問者さん「私は墨汁を使って朱色に塗るにはどうしたらいいかという質問をさせていただいております。なぜ墨汁を使いたいかというと、朱色に塗りたいからです」 こういうやりとりが繰り広げられています。答えが付かないのはその質問のおかしさが原因です。
quickquip

2021/09/23 15:46 編集

もうちょっと例えを続けると"朱色に塗りたい"理由も伝わってなくて、「キリンの絵が書きたいと思っていて、そのために朱色に塗る必要があります」みたいなことにもなっています。 "朱色に塗るにはこうしたらいい"と素直にアドバイスするのが正解とは思えませんよね。 (こっちの例えは私のかんちがいかもしれません。分かる人には分かるのかも)
guest

回答2

0

ベストアンサー

まず前提として、Pythonの*(アンパック)は、カンマ区切りで指定する箇所(関数呼び出しやリスト表示など)にイテラブル(リスト等)の要素を分割して渡すための記法です。そのため、カンマ区切り以外の箇所では使用できず、事前にアンパックだけしておくような使い方はできません。

そのうえで、見た目だけprint(swt)という記法に合わせるのであれば、以下の方法があります。

  • 最初からswtを文字列として作成する

python

1n,m = map(int,input().split()) 2swt= [list(map(int,input().split()))[1:] for lit in range(m)] 3swt = ' '.join(str(swt[0] + swt[idx]) for idx in range(m) if idx!=0) 4print(swt)
  • printした際にスペース区切りで要素を表示するリストを自作する

python

1class SpcList(list): 2 def __str__(self): 3 return ' '.join(str(e) for e in self) 4n,m = map(int,input().split()) 5swt= [list(map(int,input().split()))[1:] for lit in range(m)] 6swt = SpcList(swt[0] + swt[idx] for idx in range(m) if idx!=0) 7print(swt)

ただ、文字列として作成したら後から要素を処理できませんし、printのためだけにわざわざ新たなクラスを作成するのも無駄ですので、普通はこんなことはしません。

なぜそこまでprint(*swt)を避けなければならないのか説明できれば、もう少しまともな回答がつくと思います。

投稿2021/09/25 22:26

actorbug

総合スコア2429

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

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

0

python

1for s in swt: 2 print(s)

print(*swt)で駄目な理由。
これをするのにどうしてリスト内包が必要なのか? という必然性。

が説明されるべきと思います。


リスト内包表記はリストというデータ構造をオブジェクトを生成するという目的の構文ですs
そしてリストをprintした時の挙動はリストオブジェクトの方に書かれています。

リストに対して「このように表示したい」というコードは、リストの挙動を変更しない限りできません。
それは無理なので、オブジェクトを生成するコードの外に書かなければなりません。

「やりたいこと」に対して「リスト内包を使いたい」という前提が合っていません。

投稿2021/09/24 16:28

編集2021/09/24 23:57
quickquip

総合スコア11235

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問