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

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

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

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

Python

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

Q&A

解決済

3回答

1628閲覧

リストの整理

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2016/11/08 11:17

###前提・実現したいこと
右も左もわからない初心者です
少しわかりずらい質問ですがお願いします
来る総人数 A = 6
来るグループ数 B = 3
sekisu = [1,2,3,4,5,6]
num = [3,1,2]
start = [2,6,5]
というリストがあります
1から6までの席があったとします sekisu
numのリストは3グループいて最初に席に座る人数は3人という意味です
最初に来た3人はstartの2から順に2,3,4と座ります
最後のグループは5の席は座れますが6の席は空いていません
その場合は2人とも座らないで帰ります
そしてすべてのグループが来終わったときの空いている席を表示したいです

期待する出力
[1,5]

自分なりに考えましたがなかなかできません
重複ループになってしまっています
わかりずらい質問なのは十分承知ですがヒントでもいいので回答をお願いします
もしかしたらコードを総入れ替えしなければいけない可能性もあるかもしれません…

###発生している問題・エラーメッセージ

[1, 3, 4] になってしまう

###該当のソースコード

Python3

1A = 6 2B = 3 3sekisu = [1,2,3,4,5,6] 4num = [3,1,2] 5start = [2,6,5] 6 7for j in range(B): 8 setting = num[0] 9 taiseki = start[0] #taiseki = 2,6,5 10 11 for n in range(setting): #setting = 3,1,2 12 if start[0] in sekisu: 13 if taiseki in sekisu: 14 sekisu.remove(taiseki) 15 taiseki += 1 16 else: 17 for t in range(n): 18 sekisu.append(setting - t) 19 break 20 else: 21 continue 22 break 23 24 num.remove(setting) 25 start.remove(start[0]) 26print(sekisu)

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
Python3

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

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

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

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

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

Lhankor_Mhy

2016/11/09 01:42

昨日似たような質問に答えた覚えがあるけど、なぜかなくなってる。
退会済みユーザー

退会済みユーザー

2016/11/09 03:44

それも私の質問です。なぜか回答を見る前に消えていました。質問って消えるのですか?せっかく答えていただいたのに申し訳ありません
teamikl

2016/11/09 14:24

何か障害があったらしいので、もしかするとその影響かもしれませんね。昨晩の回答は私も覚えてます list.index が例外を投げるといったものでした、今のコードでは in を使っていて修正されてます。
guest

回答3

0

昨晩の質問・回答が消えていたので、コードを書いていいのかどうか迷うところなのですが

ヒントのみ。集合型(set) を用いると、差分の計算(席に座る)や重複(空席)チェックを
バグの入り込む余地がないくらい簡潔に記述できます。
(リストの演習問題でリストを使って挑戦してるのでしたら、的外れなので読み流してください)

投稿2016/11/09 14:22

teamikl

総合スコア8664

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

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

退会済みユーザー

退会済みユーザー

2016/11/11 03:52

setを用いるのは思いつきませんでした。頭が固いので、できるかわかりませんが試してみたいと思います。ありがとうございます
guest

0

再び、こんにちは。

P.S a_copy = list(a)でなぜlist(a)なのですかaだと違う答えになってしまいます

よろしければ教えてください

について、回答します。

まず、これらが、なぜ違う答えになるかを理解するためには、リストのコピーについて
理解する必要があるでしょう。

具体的には、たとえば以下の2つのコードの差によって、何について説明しようと
しているかが分かっている必要があります。

例1)

Python

1a = [1,2,3] 2b = a 3b.remove(2) 4print(a) # => [1, 3]と表示される。

例2)

Python

1a = [1,2,3] 2b = list(a) 3b.remove(2) 4print(a) # => [1, 2, 3] と表示される。

例1)では、b は a と同じリストオブジェクトを指しているので、b から要素 2 を削除することは、
a から要素2を削除することとは同じ操作なので、a を表示すると 2 が無くなっています。

これに対して、例2)では、b = list(a)としています。これにより bには、a と内容が同じ別の
リストオブジェクトへの参照が入ります。したがって、b から2を削除しても、a から2は
削除されておらす、元のままです。

これらの違いは基礎としてふまえて、私が回答で示した、関数 diff(a, b)を以下のようにa_copy = list(a)
ではなく、a_copy = a にした場合を考えます。

Python

1def diff(a, b): 2 3 a_copy = a 4 5 for e in b: 6 if e in a: 7 a_copy.remove(e) 8 else: 9 return a 10 11 return a_copy 12

上記の修正した関数 diff(a, b)

x = [1,2,3,4,6,7] y = [3,4,5] diff(x, y) ``` という形で使ったとします。 このときに、問題の条件から、リスト x に (yには含まれる)5 が無いので、x の要素(残っている席)は ひとつも減らずに、関数の戻り値として、呼んだときの内容 [1,2,3,4,6,7] がそのまま返ってきてほしいわけですが、やってみれば分かりますが、3と4が削除されて [1, 2, 6, 7] が返されます。 これがなぜかといえば、関数の中で、要素の削除```a_copy.remove(e)``` が e = 3 と、 e = 4 との2回実行されて、```a_copy```から、3と4が削除されるのですが、```a_copy```という変数名の "コピー"は名ばかりで、実際には```a_copy```は、```a``` と同じリストオブジェクトを**指して**います。 したがって、e = 5 のときに、```return a``` で関数から戻るときに、関数が呼ばれたときの ```a``` から 3, 4 を除いたものが返されることになってしまいますが、この結果は、題意から期待している動作では ありませんね。 これを避けるために、要素を削除していくのは、 ```a``` そのものではなく、```a``` の複製(コピー)を対象にして、 ```return a``` で抜けるときは、関数が呼ばれたときの、まだひとつも要素が削除されていない```a``` を 返すようにしてやるために、(```a_copy = a```ではダメで、)```a_copy = list(a)``` とする必要があるのです。 上記、重要なポイントであるわりにはうまく説明できているかやや心許無いのですが、 説明の中で、プログラミングの勉強の初歩の段階で、特につっこんで理解しておくとよいのは、 「(aという変数がリストオブジェクトを)**指している**」 という言葉です。これは**参照**とも呼ばれます。 もしくはC言語の用語だとこの「指すもの」は、**ポインタ**とも呼ばれます。 それと、参照に関連して、リストのコピーについて知っておくべき予備知識として **シャロー(浅い)コピーとディープ(深い)コピーの違い** も調べてみるとよいかと思います。(↑そのままググれば色々出てきます。) 最後に、参照やポインタについて基礎知識を持っておくと、今後のプログラミングの習得に 効果的と思いますので、以下の一読をおすすめします。(もうお読みになっていたらすみません) [プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識](https://www.amazon.co.jp/dp/4822283151) 以上、ご参考になれば幸いです。

投稿2016/11/11 07:58

編集2016/11/11 09:35
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2016/11/14 06:01

とても丁寧な説明ありがとうございます、理解することができました。 「シャロー(浅い)コピーとディープ(深い)コピーの違い」調べてみます。 もう一度ベストアンサーにしたいほど素晴らしい回答でした
jun68ykt

2016/11/14 12:54

ご返信、ありがとうございます。 >理解することができました。 とのことで、よかったです!
guest

0

ベストアンサー

こんにちは。

期待されている回答とは少し違うかもしれませんが、予件から以下のようなコードを作成しました。


[ykt68@macbp15 work]$ cat tera54436.py

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4# 初期設定: 5# 1.まだ座られていない座席番号リスト 6A = 6 7remaining_seats = [(i+1) for i in range(A)] 8 9# 2.各グループの着席開始番号と個数のリスト 10groups = [ 11 {'start':2, 'num':3}, 12 {'start':6, 'num':1}, 13 {'start':5, 'num':2} ] 14 15# 関数 diff(a, b) 16# リストaからリストbの要素を除去したリストを新たに生成して返す。 17# もし、bの要素でaに含まれないものがある場合、例外が発生 18def diff(a, b): 19 20 a_copy = list(a) 21 22 for e in b: 23 if e in a: 24 a_copy.remove(e) 25 else: 26 raise Exception 27 28 return a_copy 29 30# メインの処理ループ 31for g in groups: 32 try: 33 # グループ g によって取られる席番号のリストを作成 34 assigned_seats = [(g['start'] + i) for i in range(g['num'])] 35 36 # 残っている座席から取られる座席を除去して、残っている座席を更新 37 remaining_seats = diff(remaining_seats, assigned_seats) 38 39 except: 40 # 上記の関数diffが例外を返した場合、残っている座席は更新ぜず何もしない。 41 pass 42 43# 結果の表示 44print(remaining_seats)

[ykt68@macbp15 work]$ python tera54436.py
[1, 5]
[ykt68@macbp15 work]$


以上、ご自身の書かれたコードのどこにバグがあるかを見つけ出す
参考になれば幸いです。


【以下、追記】
例外を使わずに以下でもOKでした。

Python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4# 初期設定: 5# 1.まだ座られていない座席番号リスト 6A = 6 7remaining_seats = [(i+1) for i in range(A)] 8 9# 2.各グループの着席開始番号と個数のリスト 10groups = [ 11 {'start':2, 'num':3}, 12 {'start':6, 'num':1}, 13 {'start':5, 'num':2} ] 14 15# 関数 diff(a, b) 16# リストaからリストbの要素を除去したリストを新たに生成して返す。 17# ただし、bの要素でaに含まれないものがある場合、a を返す。 18def diff(a, b): 19 20 a_copy = list(a) 21 22 for e in b: 23 if e in a: 24 a_copy.remove(e) 25 else: 26 return a 27 28 return a_copy 29 30 31# メインの処理ループ 32for g in groups: 33 34 # グループ g によって取られる席番号のリストを作成 35 assigned_seats = [(g['start'] + i) for i in range(g['num'])] 36 37 # 残っている座席から取られる座席を除去して、残っている座席を更新 38 remaining_seats = diff(remaining_seats, assigned_seats) 39 40 41# 結果の表示 42print(remaining_seats)

投稿2016/11/08 14:05

編集2016/11/08 15:08
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2016/11/11 04:33 編集

関数を使えばいいのですね!まだまだ駆け出しで関数を使うのを敬遠していました。これからは使っていこうと思います。回答もわかりやすくしていただきありがとうございます。 P.S a_copy = list(a)でなぜlist(a)なのですかaだと違う答えになってしまいます     よろしければ教えてください
jun68ykt

2016/11/11 07:59

こんにちは。どういたしまして! >P.S a_copy = list(a)でなぜlist(a)なのですかaだと違う答えになってしまいます >    よろしければ教えてください について長くなったので、別回答から説明しました。参考になれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問