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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

3304閲覧

Python3 標準入力とグループ分け出力

Alter_9524

総合スコア22

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/04 05:15

編集2018/10/04 05:16

標準入力とグループ分けの問題で、コードを簡易化できないか考えています。

①A,B,C,D,Eの5人を標準入力から受け取ったデータによって3つのグループに分けます。
※例えば[1 1 3]と入力したら1人、1人、3人の3つのグループになります。

[入力] 2 1 2
[コード] person = ["A","B","C","D","E"] #グループメンバー nums = input().rstrip().split(" ") #標準入力から各グループの人数を受け取る group1 = int(nums[0]) #グループ1は2人 group2 = int(nums[1]) #グループ2は1人 group3 = int(nums[2]) #グループ3は2人 for i in range(group1): #グループ1のメンバーを取り出す print(person[i],end="") print() del person[0:group1] for j in range(group2): #グループ2のメンバーを取り出す print(person[j],end="") print() del person[0:group2] for k in range(group3): #グループ3のメンバーを取り出す print(person[k],end="")
[出力] AB C DE

なんとかコードを書いて欲しい出力は得られたのですが、どうもコードが冗長になっている気がします。
改善したほうが良い部分、変更したほうがいい部分がありましたら教えていただけないでしょうか?
よろしくお願いいたします。

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

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

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

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

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

mather

2018/10/04 05:23

「どうも冗長になっている気がする」と感じる理由はなんですか?
Alter_9524

2018/10/04 05:26

何度も同じようなコードを書かないようにしたほうがいいと以前人から教わったことがあります。for文が3つ連なってしまっていること、また単純に知識不足のために知らない関数などが他にあるのではないかと思いました。
guest

回答3

0

汎用的にnumsとpersonを全て可変入力にしても動作するはずです。

nums = [2, 1, 2] print(nums) person = ["A", "B", "C", "D", "E"] # グループメンバー start = 0 for n in nums: print(''.join(person[start:start + n])) start += n

投稿2018/10/04 05:54

opyon

総合スコア1009

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

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

0

イテレータを利用すればわりあいすっきり書けますね。

Python

1person = ["A", "B", "C", "D", "E"] 2nums = [int(n) for n in input().split()] 3 4it = iter(person) 5for num in nums: 6 for _ in range(num): 7 print(next(it), end='') 8 print()

他にもいろいろ改造していいのなら、こんなふうにも書けます。

Python

1members = list('ABCDE') 2 3it = iter(members) 4dst = [ 5 ''.join(next(it) for _ in range(n)) 6 for n in map(int, input().split()) 7] 8 9print(*dst, sep='\n')

投稿2018/10/04 05:56

LouiS0616

総合スコア35660

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

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

Alter_9524

2018/10/05 01:19

○nums = [int(n) for n in input().split()] これは標準入力から受け取ったデータをnに代入して、さらにint()で数値化している記述ですね。 ○イテレータ #[メモ]要素を反復して取り出すインターフェース。リストタプル辞書などの要素に順々にアクセスして処理するときに使う。 イテレータを使った記述を試してみましたが、for文を抜けたあとも参照するリストの位置が保持されるんですね!
Alter_9524

2018/10/05 01:22

1つ目のコードで for _ in range(num):のアンダーバー(_)はfor文内でrange(num)から受け取った数値は使わないことを表しているんでしょか?
LouiS0616

2018/10/05 05:06

はい。 アンダーバーは、そのとおり使わない数を受け取るときにしばしば使われます。 ただし文法上特殊な意味があるわけではありません。 ふつうは _ なんて分かりづらい命名はしないので、『使わない数』を格納するのに慣習上用いられます。
guest

0

ベストアンサー

例えばこんな感じでしょうか?

python

1person = ["A","B","C","D","E"] #グループメンバー 2 3nums = input().rstrip().split(" ") #標準入力から各グループの人数を受け取る 4 5group1_num = int(nums[0]) #グループ1は2人 6group2_num = int(nums[1]) #グループ2は1人 7group3_num = int(nums[2]) #グループ3は2人 8 9group1 = person[0:group1_num] 10group2 = person[group1_num:group1_num+group2_num] 11group3 = person[group1_num+group2_num:group1_num+group2_num+group3_num] 12 13result = '\n'.join([''.join(group) for group in [group1, group2, group3]]) 14print(result)

投稿2018/10/04 05:39

mather

総合スコア6753

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

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

Alter_9524

2018/10/04 05:51

自分でもfor文でうまくまとめられないだろうかと考えていたんですが、無理にfor文を利用しないほうがよさそうですね...。 ご回答頂いたコードを参考にさせていただきます。 ありがとうございました!
mather

2018/10/04 05:57

いくつか意識したポイントを書いておくと、 - できる限りprintは最後の1箇所にまとめる。デバッグ目的以外でprintを多用しない。 - 破壊的な変更を避ける(del personなど)。 - 段階的に処理を行う。(入力を受け取る→グループ分けをする→グループ分けを文字列に変換する) などです。
Alter_9524

2018/10/05 00:48

①print()は最後にまとめる ②データの破壊処理は避ける ③処理同士をまとめて段階的に記述する ですね。自分も意識してコーディングしてみます。 改めて自分のコードをみるとかなり見にくいですね(TT)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問