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

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

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

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

Q&A

解決済

2回答

811閲覧

二次元リストの列をまとめて変更する

mo256man

総合スコア43

Python

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

0グッド

0クリップ

投稿2021/05/25 02:56

前提・実現したいこと

二次元配列(リストのリスト)のある列に yyyyMMddHHmmss という14桁の数字からなる文字列があり、これを %Y/%m/%d %H:%M:%S という文字列に変換したいと考えています。

二次元配列resultsの5列目がそのデータだとすると、文字列スライスと内包表記を使って

Python

1tmpdata = [f"{r[5][0:4]}/{r[5][4:6]}/{r[5][6:8]} {r[5][8:10]}:{r[5][10:12]}:{r[5][12:14]}" for r in results]

とすることで各行の5列目のデータを一発で変換することができました。

では、元の配列resultsの5列目にこれを代入するにはどうしたらよいでしょうか。できれば、numpypandasを使わず、forループも回さないPythonicな方法で。

試したこと

代入文の左辺が[r[5] for r in results] → can't assign to list comprehensionエラー

results[:][5]results[5]と等価で5列目でなく5行目のデータ

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

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

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

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

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

guest

回答2

0

意味のないコードをこねくりまわすより、

python

1for r in results: 2 v = r[5] 3 r[5] = f"{v[0:4]}/{v[4:6]}/{v[6:8]} {v[8:10]}:{v[10:12]}:{v[12:14]}"

がまっとうかつ(おそらく)最速でしょう。

それこそがPythonicということでもあるかと。

投稿2021/05/25 04:24

編集2021/05/25 04:35
quickquip

総合スコア11061

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

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

mo256man

2021/05/25 05:37

指摘ありがとうございます。 __setitem__は今後身につけていきますが、技巧に走りすぎていると思ったのも事実です。 もっと美しい書き方があると期待してこういうお題を出した私が甘かったのですね。
quickquip

2021/05/25 06:06

個人的には、"簡潔に書ける機能が備わっているのにそれを使って書かない"ことが、"美しくない"という感覚です。
quickquip

2021/05/25 06:08

Python2のころは「簡潔な書き方」と「速い書き方」が乖離していて、速くするために技巧を凝らす意味があったのですが、Python3では"そういうのはほぼない"、"簡潔に書くのが結局速い"という感覚もあります。
guest

0

ベストアンサー

for文でループは回さないけれども、内包表記は使ってよいという条件であれば、値を使わない内包表記で出来ます。

tmpdataで入れ替えたいなら

python

1>>> results = [[0,1,2,3,4,'20210525115601'],[0,10,20,30,40,'20210525115604']] 2>>> tmpdata = [f"{r[5][0:4]}/{r[5][4:6]}/{r[5][6:8]} {r[5][8:10]}:{r[5][10:12]}:{r[5][12:14]}" for r in results] 3>>> _ = [r.__setitem__(5, t) for r, t in zip(results, tmpdata)] 4>>> print(results) 5[[0, 1, 2, 3, 4, '2021/05/25 11:56:01'], [0, 10, 20, 30, 40, '2021/05/25 11:56:04']]

直接やるなら、

python

1>>> results = [[0,1,2,3,4,'20210525115601'],[0,10,20,30,40,'20210525115604']] 2>>> _ = [r.__setitem__(5, f"{r[5][0:4]}/{r[5][4:6]}/{r[5][6:8]} {r[5][8:10]}:{r[5][10:12]}:{r[5][12:14]}") for r in results] 3>>> print(results) 4[[0, 1, 2, 3, 4, '2021/05/25 11:56:01'], [0, 10, 20, 30, 40, '2021/05/25 11:56:04']]

投稿2021/05/25 03:30

ppaul

総合スコア24666

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

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

mo256man

2021/05/25 04:08

__setitem__ は知りませんでした。勉強します。 左辺では内包表記が使えないので右辺で定義し直して、代入文としては使わないということですね。 素早い回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問