Pythonリストの要素の順番を入れ替え、結合する方法

このQ&Aのポイント
  • Pythonのリストにおいて、要素の順番を入れ替えて結合する方法を解説します。
  • indexを使って要素の順番を入れ替えることは可能ですが、最初に出てきた要素しか処理しません。また、要素の結合も行っていません。
  • リスト内に1や2が複数回出現する場合や、1と2の順番が逆であるケースにも対応したスクリプトを作成する方法についても説明します。
回答を見る
  • ベストアンサー

Pythonでリストの要素の順番を入れ替え、結合したい

Pythonでリストの要素の順番を入れ替え、結合したい 以下のようなリスト(入力list)があります。"1"もしくは"2"が出てきたら、それぞれ次の要素と順番を入れ替え、かつ1つの要素に結合するスクリプトを書きたいのですが、案はありますでしょうか。以下の出力listのような出力を望んでいます。 入力 list=['a', 'b', '1', 'c', 'd', 'e', '2', 'f', '2', 'g'] 出力 list=['a', 'b', 'c1', 'd', 'e', 'f2', 'g2'] 1や2が出てくる回数はリストにより異なり、また1より2の方が先に出てくる場合もあります。またリストによっては1がない場合、2がない場合もあります。(ただし '1', '2' のように1と2が連続で出てくることはありません。かならず間に別の要素が入ります) indexを使って要素の順番の入れ替えはできるようなのですが、最初に出てきたものしかとらえないので、例えば上の例でいうと2,gがg2に変換されません。また結合もできていませんが、indexを使った入れ替え方法を一応以下に記しておきます: i=list.index("1") j=list.index("2") list[i],list[i+1]=list[i+1],list[i] list[j],list[j+1]=list[j+1],list[j] とすると、出力リストは['a', 'b', 'c', '1', 'd', 'e', 'f', '2', '2', 'g']となります。 (最後のg2が変換できていない。また結合もできていない) Python初心者です。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

#スペース削除対策で スペースを_で表わしている #使用する際にはスペースに置換すること i=0 #"1","2"が最後にくることはないので、len(list)-1までの範囲で調べる while ( i < len(list) - 1 ) : ____# 要素が"1"か"2"か調べる。 ____if list[i] == "1" or list[i] == "2": ________# 次の要素と入れかえて結合した文字列list[i+1] + list[i] ________# を 現在の要素の値にする ________list[i] = list[i+1] + list[i] ________#次の要素は不要なので削除する ________del list[i+1] ____i += 1 入れ替えるとか結合するとかをちょっと難しく考えすぎてしまったのではないでしょうか?

juillet07
質問者

お礼

ありがとうございます!! そんなに簡単にできたのですね。確かに難しく考えすぎていたかもしれません。 何時間も頭をひねっていたので、ものすごいすっきり感です。

関連するQ&A

  • ACCESSでの結合プロパティについて

    ACCESSでの結合プロパティは、3つあって、1つ目は2つのテーブルに共通するものだけを引っ張ってくる。 2つ目は片方の全部と、もう1方では、共通するものだけ。3つ目は、2つ目の逆。 両方のレコードを持ってくるということは出来ないのでしょうか? 例:「data」で結合して、表示は、今回厳密には定義しません。 テーブル1 ID data 1 a 2 b 3 c 4 d 5 e 6 f テーブルB ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j 結合プロパティ(1)では、 ID data 4 d 5 e 6 f 結合プロパティ(2)では、 ID data 1 a 2 b 3 c 4 d 5 e 6 f 結合プロパティ(3)では、 ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j となると思います。 今やりたいことは、全部持ってくることです。 ID data 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 I 10 j よろしくお願い致します。

  • python超初心者です(3時間目)。pythonで以下のようなランダ

    python超初心者です(3時間目)。pythonで以下のようなランダム数列を生成させるにはどうしたらいいのでしょうか? 最終結果のイメージ(16進数8桁の数列x20行): 0 : c39a29eb 1 : b26cc9bb 2 : 4c494e47 ... 19: 93c85836 以下のようにコードを組んでみたのですが、 > tmp = ws.join(list) > TypeError: sequence item 0: expected string, int found のようなエラーが出てしまいます。どうやら数字を連結しようとしてるのでダメなのかな?と思っています。 ======================================== #! /usr/bin/python import random list = [] ws = "" for i in range (20): print i, ":", for j in range(8): list.append(random.randint(0,15)) tmp = ws.join(list) print tmp list = [] tmp = "" ======================================== ※ printでは必ずスペースが入ってしまうので、それを嫌う場合配列に入れて、要素を連結させなくてはならない、とwebにあったので、その方向で試してみました。 ※ また、ここではあくまでrandom を使用し、一文字(0,1,2,...E,F)づつ出力させたいと思っています。 なお、perlでは以下のように書くことができたのですが... ======================================== #! /usr/bin/perl for($i=0; $i<20; $i++){ printf ("%-02s: ", $i); for($j=0; $j<8; $j++){ printf("%x", int(rand(15)) ); } print "\n"; } ======================================== ※ んー第二言語としてpythonを学習してみていますが道のり険しそうです(やっぱrubyにしようか)... 宜しくお願い致します。

  • Python リスト内の要素取り出しについて

    ProgateでPythonを1から学んでいる初心者です。 現在、じゃんけんゲーム作成のセクションに取り組んでいるのですが、その中でリストの要素取り出しについて疑問点があるため質問いたしました。 詳しくは画像を参照いただければ分かりやすいかと思うのですが、 ------------------------------ def print_hand(hand, name='ゲスト'): # 変数handsに、複数の文字列を要素に持つリストを代入してください hands = ("グー", "チョキ", "パー") # リストhandsを用いて、選択した手が出力されるように書き換えましょう print(name + 'は' + hands[hand] + 'を出しました') ------------------------------- という点に関して、なぜ hands[hand] でリスト「hands」内の要素が取り出せるのか分かりません。 この時点では、「hand」が「hands」内の要素に対応していることは、明示されていなくないですか? グーが0、チョキが1、パーが2に対応することは分かっているのですが。。。 ずぶの素人質問で申し訳ございませんが、ご教授お願いいたします。

  • Pythonにおける空要素での2次元配列作成の方法

    現在、Pythonにおける空要素の2次元配列の作成(初期化)について、 初歩的な事柄でありながらも引っかかっています。 list1 = [] print(list1) #[] list2 = [[]for i in range(5)] print(list2) #[[], [], [], [], []] list3 = [[0 for i in range(5)] for j in range(3)] print(list3) #[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] list4 = [["" for i in range(5)] for j in range(3)] print(list4) #[['', '', '', '', ''], ['', '', '', '', ''], ['', '', '', '', '']] 各種解説サイトを探して、list3やlist4の形での作成方法は見つけたのですが、 list1やlist2のように、完全な空要素(null?)での方法は見当たらず、 自分でも手探りで試してみたのですが、うまくいきませんでした。 今欲している、 #[[], [], [], [], []], [[], [], [], [], []], [[], [], [], [], []] という出力を得るためには、どのように作成したらよろしいでしょうか。

  • 地層の順番

    次の写真のアルファベットの形成を並び替える問題です。 答えはD→C→F→E→G→H→I→B→J→Aです。 ここで質問です。IとBはどちらが先でも後でも良いように感じる(D→C→F→E→G→H→B→I→J→A)のですが、なぜIが先となるのでしょう? よろしくおねがいします。

  • pythonのメゾッドの整合性について

    こんばんは。 pythonを勉強し始めましたが理解できない部分があって質問させて頂きます。 プログラム、特にオブジェクト指向をまだよく理解していないのである程度初心者向けの回答をお願いします。 pythonにおいて文字列はオブジェクトであり、 >>> strA = "python" >>> print (strA) python >>> print (strA.upper()) PYTHON >>> print (strA) python のように使われるメゾッドが存在しています。 これはオブジェクト自体を変化させるのではなく、今回の場合ではオブジェクトがupper()されたオブジェクトを返しています(まちがっていませんよね?)。 そのため、strA自体を変化させるには >>> strA = strA.upper() >>> print (strA) PYTHON のようにする必要があると理解していました。 ここで新しいオブジェクトlistを用いた時 >>> tl = ['A','B','C','D','E','F'] >>> print (tl) ['A', 'B', 'C', 'D', 'E', 'F'] >>> print(tl.reverse()) None >>> print(tl) ['F', 'E', 'D', 'C', 'B', 'A'] >>> listA.reverse() となります。文字列から類推すると >>>tl = ['A','B','C','D','E','F'] >>>print (tl.reserve()) ['F', 'E', 'D', 'C', 'B', 'A'] >>>print(tl) ['A','B','C','D','E','F'] >>>tl =tl.reserve() >>>print (tl) ['F', 'E', 'D', 'C', 'B', 'A'] のような振る舞い方を行うのが"正しい"と思うのですがなぜ違うのでしょうか?

  • python リストのプログラムがうまくいかない

    閲覧ありがとうございます。 学校の講義にてgoogle colaboでpythonを使っています。 課題 複数の記事を読み込んで、行を記事、単語を列とした単語数カウントの行列を作成せよ (ファイルは 単語:単語数 単語:単語数... で、行末尾にnegativeとなっていて、1行に1記事ずつ入っている) import numpy as np import matplotlib.pyplot as plt with open('/content/drive/MyDrive/train.processed') as f: articles = f.readlines() # 記事を読み込む list_articles = [] # 記事単位のリスト list_words = [] # 単語単位のリスト list_count = [] # 単語数カウントの行列 x = len(articles) for article in articles: list_articles.append(article.split()) # 記事ごとに[単語:単語数]で配列に入れる(二次元) for i in range(x): # x=記事数 for j in range(len(list_articles[i])-1): # negativeを除いた1記事当たりの単語数 if not '::' in list_articles[i][j]: # 単語として[:]があるとバグるのでない場合のみ処理を行う(::3みたいになってる) col = list_articles[i][j].find(':') # 単語と単語数の間の:の位置を求める word = list_articles[i][j][:col] # コロン未満(単語部分)をwordに代入する if not word in list_words: # list_wordsにない場合、追加する list_words.append(word) list_count.append([0 for k in range(x)]) # 記事数分のリストを追加する(行列に1行追加) list_count[i][list_words.index(word)] = int(list_articles[i][j][col+1:]) # 何記事目かを行、何の単語かを列として単語数を代入 print(word) list_count[i][list_words.index(word)] = int(list_articles[i][j][col+1:]) ここでIndex out of rangeが出ます。print(word)で途中まで出力されるので、エラーが起きながら動いていたのか、途中でエラーが起きて止まったのかもわかりません。 色付きのプログラムを写真に添付します。 かなり時間をかけて考えたのですが、理解できなかったので質問させていただきました。 よろしくお願いします。

  • リストからの選択

    エクセルにて文字を入れる際にデータの入力規制を用いてリストから選択するようにしているのですが、そのリストを可変的にしたいのですが可能でしょうか? A1のセル: A,B,C から選択 A2のセル: A1が"A"の場合D,E,F       A1が"B"の場合D,G,H       A1が"C"の場合E,I,J の選択させたいです。

  • python ですが下記のプログラムがエラーになり

    python ですが下記のプログラムがエラーになります。どうしてでしょうか。よろしくお願い致します。 def revers(data): for index in range(len (data)-1,-1,-1): yield data[index] some_list = [‘a’, ‘b’, ‘c’, ‘d’] for e in revers(some_list): print(e) 実行結果をd      c      b      a にしたいのですがエラーがでます。

  • リストのデータを重複なしでランダムに抽出する

    シート1に下記のように14種類の名前リストがあります     A 1   A 2   B 3   C 4   D 5   E 6   F 7   G 8   H 9   I 10  J  11  K 12  L 13  M 14  N 上記の名前を下記のように別シートの数列おきの列(行は同一)に重複なしに行毎にランダムに抽出する事が関数で出来るでしょうか?(エクセルは2010です) ちなみに下記は一列おきのセルに抽出した例です   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA 1 D   L   K    I    A   M   N    B   H   J    C    F    E   G 2 K   J   M   H    I   G   F    E   D    A    B   N   C    L 3 E   J   A    L   B   M    K   C   N    G    F   D    H   I どなたか教えていただける方がおりましたらよろしくお願いします。

専門家に質問してみよう