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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

1041閲覧

自分のアルゴリズムのどこがおかしいのかずっと考えてるのですがわかりませんのでご指摘お願いします

aiueo04

総合スコア26

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/04/23 13:37

今自分がやっていることはリストで[1,2,0,4,0,5,6,7,0,0,9,0,]のような引数が関数に入り、関数内ではリスト内の0を全部右端に寄せるということです。その際に他の要素の順番は変えません。
したがって、正しい答えは[1,2,4,5,6,7,9,0,0,0,0]となります。

自分の考えは
まず、num=0とし、goukei変数にcount()で数えた0の数を代入します。そしてインクリメントしnumがgoukeiと同じかずになるまでwhileで繰り返します。繰り返す内容は、indexでリスト内の最小のインデックスの0を取り出してindex変数に代入。
そして、arrrayの最後のインデックス(-1)に先程のindexを利用しarray[index]を代入して置き換えます。

ずっと考えてるのですがわかりません。お力添えをお願いします

def move_zeros(array): num=0 goukei=array.count(0) while num<=goukei: index=array.index(0) array[-1]=array[index] num+=1 return array

[1,2,0,1,0,1,0,3,0,1]が引数として入ると[1, 2, 0, 1, 0, 1, 0, 3, 0, 0]が返ってきちゃうみたいです。

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

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

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

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

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

Zuishin

2020/04/23 13:41

移動させず配列の最後尾に上書きコピーしていますね。
guest

回答3

0

LouiS0616さんが書かれているもう一つの方法です。

python

1def move_zeros(array): 2 return [data for data in array if data != 0] + [0] * array.count(0) 3 4print(move_zeros([1,2,0,4,0,5,6,7,0,0,9,0,])) 5print(move_zeros([1,2,0,1,0,1,0,3,0,1]))

投稿2020/04/23 18:00

編集2020/04/23 18:03
shiracamus

総合スコア5406

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

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

aiueo04

2020/04/24 05:21

自分が書いたコードより非常にシンプルでわかりやすいです!ありがとうございます!!
guest

0

ベストアンサー

array[-1]=array[index]

最終要素に代入しているだけだからです。
0を代入するのに伴って、他の要素が勝手にずれてくれるわけではありません。

例えばリスト a = [1, 0, 3, 4] があったとして、a[-1] = a[1] を実行したとします。
このときaは [1, 0, 3, 0] になります。 [1, 3, 4, 0] にはなりません。


要素の削除・挿入は案外計算量を食うので、
[0以外のリスト] + [0] * 0の個数 で新しくリストを作った方が効率が良さそうです。

投稿2020/04/23 13:40

編集2020/04/23 13:46
LouiS0616

総合スコア35660

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

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

aiueo04

2020/04/23 13:55

なるほど!たしかに、上書きしてただけでした。もう一度やり直してみますね
aiueo04

2020/04/23 14:02

あと、もしよろしければなんですけど、リスト内の要素の順番を変える方法を教えていただくことはできませんでしょうか?二つのリストに分けてやるやつはできたのですが、順番を変えるほうほうがわからなくて
LouiS0616

2020/04/23 14:05

list.popとlist.appendを併用すれば良いです。 array.append(array.pop(index))
guest

0

2つの方法を示します。

pp.py

python3

1def move_zeros(data): 2 zero_count = data.count(0) 3 if zero_count == 0: 4 return data 5 6 first_zero_index = len(data) - zero_count 7 while True: 8 index = data.index(0) 9 if index == first_zero_index: 10 break 11 12 # また 移動できていない 0 を見つけたので その 0 を末尾に移動する 13 data.pop(index) 14 data.append(0) 15 return data 16 17def move_zeros_x(data): 18 non_zeros = [] # 0 ぜない要素を順番に蓄えていく 19 zeros = [] # 0 を蓄えていく 20 21 for i in range(len(data)): 22 if data[i] == 0: 23 zeros.append(0) 24 else: 25 non_zeros.append(data[i]) 26 27 return non_zeros + zeros 28 29 30z = [1, 2, 0, 4, 0, 5, 6, 7, 0, 0, 9, 0] 31print(move_zeros(z)) 32print(move_zeros_x(z))

実行例
イメージ説明

投稿2020/04/23 22:30

katoy

総合スコア22324

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

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

aiueo04

2020/04/24 05:20

ご丁寧な回答感謝します!!めちゃくちゃべんきょうになります!!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問