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

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

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

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

Q&A

解決済

2回答

3055閲覧

pythonでテキスト編集(並べ替え)できるかの質問です。

asanoseiji

総合スコア7

Python

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

0グッド

0クリップ

投稿2018/04/02 16:49

前提・実現したいこと

テキストファイルを読み込み、ある条件下のセンテンス毎に
並び替えて保存するプログラムを作成したいです。

プログラムはpythonしかわかりません。
他のプログラムのほうがよければ、ご教授いただければ幸いです。

具体的に並べ替えたい文章のイメージです。

※ランダムはランダムな文章です。

▼下記のようなテキストを

①ランダムランダムランダム
ランダムランダム
ABC 123

②ランダムランダムランダム
ランダムランダム
ABC 123

③ランダムランダムランダム
ランダムランダムランダム
ABC 123

①ランダムランダムランダム
ランダムランダム
DEF 456

②ランダムランダムランダム
ランダムランダム
DEF 456

③ランダムランダムランダム
ランダムランダムランダム
DEF 456

①ランダムランダムランダム
ランダムランダム
GHI 789

②ランダムランダムランダム
ランダムランダム
GHI 789

③ランダムランダムランダム
ランダムランダムランダム
GHI 789

▼次のように並び替える
プログラムを作りたいです。

①ランダムランダムランダム
ランダムランダム
ABC 123

①ランダムランダムランダム
ランダムランダム
DEF 456

①ランダムランダムランダム
ランダムランダム
GHI 789

②ランダムランダムランダム
ランダムランダム
ABC 123

②ランダムランダムランダム
ランダムランダム
DEF 456

②ランダムランダムランダム
ランダムランダム
GHI 789

③ランダムランダムランダム
ランダムランダムランダム
ABC 123

③ランダムランダムランダム
ランダムランダムランダム
DEF 456

③ランダムランダムランダム
ランダムランダムランダム
GHI 789

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

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

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

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

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

guest

回答2

0

他の言語でもいいということなので。
特殊変数をしかるべく設定するとperlは複行レコードを普通に捌いてくれます。
テキスト処理なら今もってperl最強。

以下の例で、テキストはinput.txtにあるとします。

$ perl -e '$/=""; print sort <>; print "\n"' input.txt

投稿2018/04/02 18:47

KojiDoi

総合スコア13669

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

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

asanoseiji

2018/04/04 13:53

回答ありがとうございます。 perlも一度勉強してみます。
guest

0

ベストアンサー

質問の意図は文字列をセンテンスというかパラグラフで分け、①や②などでソートしたいということでよろしいでしょうか?
改行が二回連続したところでsplitするのは容易ですし、幸い丸囲み数字はunicode上で綺麗に並んでいますからデフォルトのソート関数でソートできます。やるとすると、次のようなプログラムになります。

python

1string = """①ランダムランダムランダム 2ランダムランダム 3ABC 123 4 5②ランダムランダムランダム 6ランダムランダム 7ABC 123 8 9③ランダムランダムランダム 10ランダムランダムランダム 11ABC 123 12 13①ランダムランダムランダム 14ランダムランダム 15DEF 456 16 17②ランダムランダムランダム 18ランダムランダム 19DEF 456 20 21③ランダムランダムランダム 22ランダムランダムランダム 23DEF 456 24 25①ランダムランダムランダム 26ランダムランダム 27GHI 789 28 29②ランダムランダムランダム 30ランダムランダム 31GHI 789 32 33③ランダムランダムランダム 34ランダムランダムランダム 35GHI 789""" 36 37lst = string.split("\n\n") 38 39result = "\n\n".join(sorted(lst)) 40 41print(result)

最後の行も順番通り揃うことを期待するのであれば、このプログラムはうまく機能しません。ランダム部分が上位桁のような扱いになって先にソートされてしまうので、最後の行が優先されないからです。対策としては、sorted関数のkey引数を使って最初の一文字+パラグラフの最終行を対象にソートするようにすることが可能です。上のコードのresult=~の行を次のように置き換えます。

python

1result = "\n\n".join(sorted(lst, key=lambda s: (s[0], s.split("\n")[-1])))

投稿2018/04/02 17:17

編集2018/04/02 17:33
hayataka2049

総合スコア30933

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

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

asanoseiji

2018/04/04 13:52

回答ありがとうございます。 質問の意図はその通りですが、①、②でソートした際に、最後の行も順番通りにそろえたいです。 result以降を教えて頂いたkeyを使って書き換えた所、順番通りになりません。 例にABC 123と書いた部分は、以下のような地名と名前という構成です。 同じ地名はありませんが、東京都だけ同じ人はいます。 人の並びは変えずに、ソートしたいです。 東京都練馬区 武田さん 東京都足立区 鈴木さん 岐阜県関市  田中さん
hayataka2049

2018/04/04 22:32

掲載したコードは、最後の行もソートの対象にするものです。 最後の行については、元の順番を保持したいということでよろしいでしょうか。それでしたら、sorted(lst, key=lambda s:s[0])を使ってください。最初の一文字(丸囲みの数字)だけでソートします。pythonのソートは安定ソートなので、それで十分なはずです
asanoseiji

2018/04/05 15:20

狙い通り動きました。 教えて頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問