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

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

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

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

Q&A

解決済

2回答

388閲覧

Python 並び替え 要素の種類によって昇順、降順を切り替える

reo037

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2022/08/03 09:12

編集2022/08/03 09:13

前提

Pythonでリストの並び替えをしたいです。

実現したいこと

Python

1list = [('1', 'f', 250), ('2', 'f', 400), ('3', 'f', 100), 2 ('4', 'm', 150), ('5', 'm', 700), ('6', 'm', 350)]

以上のリストを、
第2要素が'f'については、第3要素が昇順となるように並べ替え、
第2要素が'm'については、第3要素が降順となるように並べ替えたいのです。

Python

1list = [('3', 'f', 100), ('1', 'f', 250), ('2', 'f', 400), 2 ('5', 'm', 700), ('6', 'm', 350), ('4', 'm', 150)]

order_byやsortを使うと、全てに昇順、降順が適応されてしまいます。
リストを二つに分けてから、それぞれを並び替えて、リストをくっつけるなどはあまりしたくありません。
できるだけシンプルな処理で、並び替えができますでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

第一要素は無視ですかね?
sortsortedkeyに関数を指定して、ソートキーを作ります。

Python

1foo = [('1', 'f', 250), ('2', 'f', 400), ('3', 'f', 100), 2 ('4', 'm', 150), ('5', 'm', 700), ('6', 'm', 350)] 3 4foo.sort(key=lambda x:(x[1],x[2] if x[1]=='f' else -x[2])) 5 6print(foo)

わかりにくければ、

Python

1def make_key(x): 2 if x[1]=='f': 3 return (x[1], x[2]) 4 else: 5 return (x[1], -x[2]) 6 7foo.sort(key=make_key)

投稿2022/08/03 09:45

otn

総合スコア84542

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

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

reo037

2022/08/04 00:03

ifの内包表記でも可能なんですね! 関数での表記も記載していただき、ありがとうございます。
otn

2022/08/04 00:27 編集

内包表記ではないです。内包表記とは何なのか再確認しましょう。
guest

0

python

1 2lst = [('1', 'f', 250), ('2', 'f', 400), ('3', 'f', 100), 3 ('4', 'm', 150), ('5', 'm', 700), ('6', 'm', 350)] 4 5lst_sorted = sorted(lst, key=lambda x: (x[1], x[2] * {'m': -1}.get(x[1], 1))) 6print(lst_sorted)

投稿2022/08/03 09:36

編集2022/08/03 09:50
melian

総合スコア19771

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

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

LouiS0616

2022/08/03 10:40

{'m': -1}.get(x[1], 1) の代わりに [-1, 1]['m' != x[1]] でも行けそうですね。 どっちが分かり易いかは... 微妙な線かもしれませんが。
melian

2022/08/03 10:49

'f' や 'm' 以外にも増えるかもしれませんので。。。
reo037

2022/08/04 00:04

*の使い方や、getの使い方について勉強になりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問