回答編集履歴

1 単語の修正

hayataka2049

hayataka2049 score 29838

2018/04/03 02:33  投稿

質問の意図は文字列をセンテンスというかパラグラフで分け、①や②などでソートしたいということでよろしいでしょうか?
改行が二回連続したところでsplitするのは容易ですし、幸い丸字はunicode上で綺麗に並んでいますからデフォルトのソート関数でソートできます。やるとすると、次のようなプログラムになります。
改行が二回連続したところでsplitするのは容易ですし、幸い丸囲み数字はunicode上で綺麗に並んでいますからデフォルトのソート関数でソートできます。やるとすると、次のようなプログラムになります。
```python
string = """①ランダムランダムランダム
ランダムランダム
ABC 123
②ランダムランダムランダム
ランダムランダム
ABC 123
③ランダムランダムランダム
ランダムランダムランダム
ABC 123
①ランダムランダムランダム
ランダムランダム
DEF 456
②ランダムランダムランダム
ランダムランダム
DEF 456
③ランダムランダムランダム
ランダムランダムランダム
DEF 456
①ランダムランダムランダム
ランダムランダム
GHI 789
②ランダムランダムランダム
ランダムランダム
GHI 789
③ランダムランダムランダム
ランダムランダムランダム
GHI 789"""
lst = string.split("\n\n")
result = "\n\n".join(sorted(lst))
print(result)
```
最後の行も順番通り揃うことを期待するのであれば、このプログラムはうまく機能しません。ランダム部分が上位桁のような扱いになって先にソートされてしまうので、最後の行が優先されないからです。対策としては、sorted関数のkey引数を使って最初の一文字+パラグラフの最終行を対象にソートするようにすることが可能です。上のコードのresult=~の行を次のように置き換えます。
```python
result = "\n\n".join(sorted(lst, key=lambda s: (s[0], s.split("\n")[-1])))
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る