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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9858questions

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

Pythonのリストの変形について

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 968

mofu_mofu

score 60

お世話になっております。

Pythonのリストを変形させてデータが欲しいのですが、途中でfor文が終わってしまいます。
例えばstart=1 end=6なら['@@@1,@@@2','@@@3,@@@4','@@@5,@@@6']のように出力させたいのですが、なぜか['@@@1,@@@2','@@@3,@@@4']のように途中で終わってしまいます。

デバッグしてみたのですが、変数aまでは意図している動きをしているので、for文の中でおかしくなってしまっているようです。
リストaをpopしつつforしているので動作がおかしくなるのでしょうか?

ようするに["a","b","c","d"]を["ab","cd"]にしたいだけなのですが思ったよりもハマってしまい...

以上よろしくお願いいたします。

#欲しい結果
 ['@@@117,@@@118', '@@@119,@@@120', '@@@125,@@@126', ...(中略)..., '@@@161,@@@162', '@@@163,@@@164','@@@165,@@@166']
#吐き出される結果
 ['@@@117,@@@118', '@@@119,@@@120', '@@@125,@@@126', ...(中略)..., '@@@147,@@@148', '@@@149,@@@150']
start = 117
end   = 166

hoge = range(start, end + 1)

a = ["@@@" + str(i) for i in hoge]
new_list = []

for i in a:
    temp = a.pop(0)

    temp2 = a.pop(0)

    string = temp + "," + temp2
    new_list.append(string)
print("new list is %s" %new_list)

Python3.6
Windows 10

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

ループ中にコンテナを操作してはいけません。

a = [1, 2, 3]
for e in a:
    print(a.pop(0))

実行結果 Wandbox

1
2

代替策

私ならこう書きます。

r = range(117, 166)
new_list = [
    r'@@@{0},@@@{1}'.format(f, s) for f, s in zip(*[iter(r)]*2)
]

print(new_list)

実行結果 Wandbox

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/16 16:46

    LouiS0616様
    迅速なご対応ありがとうございます。数分でかつ数行で回答されていることに驚いています。本当にありがとうございます。

    キャンセル

+2

for i in a:

while a:

にすれば動きますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/16 16:52

    たしかに

    ただなぜうまく行くのか理解していないと、今度は.removeでバグりますね

    キャンセル

  • 2018/02/17 08:33

    全然オススメはしないやり方です。質問者さんのコードをなるべくそのまま使うなら、という念頭に書きました。

    キャンセル

checkベストアンサー

+1

どこがおかしいのか、詳しくは分かりませんが、新しく書き直しました。
下記のコードで欲しい結果は手に入ります。

start = 117
end   = 166
new_list = []
for i in range(start,end,2):
    new_list +=["@@@" + str(i)+","+"@@@" + str(i+1)]
print(new_list)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/16 16:42

    迅速にご対応していただき本当にありがとうございます。
    複数回答があり、BAを迷ったのですが、初心者でも理解しやすい84zero様のコードをBAにさせていただきます。rangeのステップを使えばこんなにシンプルに表現できるのですね。
    ありがとうございました。

    キャンセル

+1

for文でaの代わりにa[:]と書いてもうまくいきませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python 3.x

    9858questions

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