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

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

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

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

Q&A

解決済

2回答

425閲覧

リストの特定文字列でのソート

s-tanaka

総合スコア1

Python

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

0グッド

0クリップ

投稿2023/03/31 02:39

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

pythonにて
文字列+数値で構成されているリストをソートしたい。
ソートのkeyは正規表現で指定した文字でソートしたい。

ここに質問の内容を詳しく書いてください。
(例)
以下のプログラム(行番号を追記しました)でリストl(要素数3)にてXに続く文字で昇順にソートしたい。

1:import re
2:
3:l = ['ABXR9876.txt', 'CDXF0001.txt', 'EFXG100.txt']
4:print(sorted(l ,key = lambda s: chr(re.search(r'[A-Z]{2}X(.)',s).group(1))))

エラーメッセージ 実行すると4行目でエラーがでた。 TypeError: an integer is required (got type str)

該当のソースコード

python

1import re 2 3l = ['ABXR9876.txt', 'CDXF0001.txt', 'EFXG100.txt'] 4print(sorted(l ,key = lambda s: chr(re.search(r'[A-Z]{2}X(.)',s).group(1))))

試したこと

ここに問題に対して試したことを記載してください。

4行目を以下のコードにすると数字でのソートはできた。
print(sorted(l, key=lambda s: int(re.search(r'\d+', s).group())))

#['CDXF0001.txt', 'EFXG100.txt', 'ABXR9876.txt']

補足情報(FW/ツールのバージョンなど)

Spyder 4.0.1
Python 3.7.6 64-bit | Qt 5.9.6 | PyQt5 5.9.2 | Windows 10
にて実施

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2023/03/31 02:46

chr ではなく ord ではどうでしょう。 print(sorted(l ,key = lambda s: ord(re.search(r'[A-Z]{2}X(.)',s).group(1))))
can110

2023/03/31 04:10 編集

「Xに続く文字で昇順にソート」とは提示コードでいえば ['R9876.txt', 'F0001.txt', 'G100.txt']の部分を (数字部分も含めて)文字列として辞書順にソートしたいということでしょうか。 それとも、Xに続く1文字、つまりR,F,Gの部分をソートしたいということでしょうか。 であれば単にe.search~.group(1)の結果をキーとしてソートすればよいと思いますが。
s-tanaka

2023/03/31 04:09

melianさん 解決しました。ありがとうございます。 ただ、以下のリストの様に正規表現でヒットしない要素が存在するときは l = ['ABXR9876.txt', 'CDXF0001.txt', 'EFXG100.txt' ,'ABCDE0001.txt'] 以下のエラーが出ました。 AttributeError: 'NoneType' object has no attribute 'group' 回避策はあるでしょうか?
quickquip

2023/03/31 04:13

似た指摘になってしまうのですけれど、 ['ABXR9876.txt', 'CDXF0001.txt', 'EFXG100.txt'] に対する欲しい結果は、F,G,Rの1文字だけをみて ['CDXF0001.txt', 'EFXG100.txt', 'ABXR9876.txt'] ということで合ってますか? (だとしたら"4行目を以下のコードにすると数字でのソートはできた。"がミスリードなので??となっています)
quickquip

2023/03/31 04:15 編集

追加で質問があるなら質問を書き換えましょう。(この欄で返事をする必要はあまりなくて、質問を書き換えるか自己回答をするかしたりした方がまだいいです)
melian

2023/03/31 04:35 編集

> 回避策はあるでしょうか? Python 3.8 以降であれば walrus operator(:=) を使用して以下の様に書けますが、Python 3.7.6 をお使いとのことなので、別途関数を定義するとよいかと思います。(256 という値は適当です。wide character を含める場合は math.inf などを指定する方がよいかもしれません) print(sorted(l ,key = lambda s: ord(m.group(1)) if (m := re.search(r'[A-Z]{2}X(.)',s)) else 256))
quickquip

2023/03/31 04:49 編集

> 正規表現でヒットしない要素が存在するとき にどうしたいですか? たいして考えなくても 末尾にしたい 先頭にしたい 結果のリストから取り除きたい (これはソートだけではできないですが) くらいの選択肢はでてくるはずですが、それが書かれてないです。
s-tanaka

2023/03/31 05:00

melianさん 有難うございました。
guest

回答2

0

単に、

Python

1print(sorted(l ,key = lambda s: re.search(r'[A-Z]{2}X(.)',s).group(1)))

で良いと思いますが、chrを付けた意図は何でしょうか?chrは数値を引数にとって、その数値を文字コードとする文字を返す関数です。

また、お書きのコードだと、
「リストの各要素には、先頭からとは限らないが英大文字2文字の後にXが続く部分が必ずあり、そのXの次の文字をソートキーにする」
ですが、認識は合ってますか?
「英大文字」「英大文字」X 「何らかの文字」 という4文字続きが存在しないリスト要素があると、エラーです。
また、2023ABXY000.txtのように4文字続きが途中にある場合にでもマッチして、この場合はYが取り出されます。

投稿2023/03/31 04:08

otn

総合スコア84555

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

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

s-tanaka

2023/03/31 04:22

chrを付けた理由はデータ型の定義が必要と思ったからです。深い意味はありません。 ご教示の通りchrを取ると動作しました。ありがとうございます。 ソート条件は英大文字2文字の後のXの後という認識で合っています。 リストの中にはマッチしない文字列も含まれ、以下のエラーが出ます。 AttributeError: 'NoneType' object has no attribute 'group' 回避策をご教示ください。
otn

2023/03/31 05:52 編集

マッチしないときにどうしたいか? ・そのデータは結果に不要 ⇒ filter関数などで条件に合わない物を抜いてからソート ・そのデータは先頭or末尾に置く ⇒ キーを返す関数内で、正規表現にマッチしない場合は、'\x00'とかc\xFF'を返すようにifを追加
otn

2023/03/31 05:55

> chrを付けた理由はデータ型の定義が必要と思ったからです。深い意味はありません。 Python文法についての誤解がありそうなので、今後のためには、そう思ってしまった理由を掘り下げた方が良いですね。
s-tanaka

2023/03/31 06:53

otnさん 参考になりました。 有難うございました。
guest

0

自己解決

有難うございました。ご教示頂いたことより解決しました。
chr ではなく ord で記述します。
HITしないときは別途検討します。

投稿2023/03/31 05:22

編集2023/03/31 05:24
s-tanaka

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問