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

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

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

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

Q&A

2回答

722閲覧

Python 内包表記について

xxyyxx

総合スコア40

Python

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

0グッド

0クリップ

投稿2021/04/15 04:08

編集2021/04/15 04:48

概要

Pythonの内包表記についてです。
目的としては、内包表記で、以下のリストにある要素"b"のみを変換 (UTC->JST)することです。
出力は他要素も合わせて出力したいです。

前提

  • Python 3.7
  • リストサンプル
[ [ { 'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 00, 00, tzinfo=tzlocal()), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' }, { 'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 00, 00, tzinfo=tzlocal()), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' } ], [ { 'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 00, 00, tzinfo=tzlocal()), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' }, 以下略

質問

for文では以下のように書けば、他要素も合わせてb要素がJSTとなって出力されました。

for v in lst: for x in v: x['b'] = x['b'].astimezone(datetime.timezone(datetime.timedelta(hours=+9))) print(lst)

これを内包表記で表現することは可能でしょうか?!
よろしくお願い致します。

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

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

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

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

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

quickquip

2021/04/15 04:15

リストサンプルが微妙に間違っているような気がします……
xxyyxx

2021/04/15 04:19

どこらへんでしょうか?
quickquip

2021/04/15 04:38 編集

「「辞書のリスト」のリスト」なら上下に [] がもう一段要りそうです。 「辞書のリスト」なら中程の ],[ は , でないといけなさそうです。 このままだと「「辞書のリスト」の1値タプル」ができて捨てられるデータがありそうです。 ざっくり"なんか変"です。
xxyyxx

2021/04/15 04:34

たしかにそうでした! 本来は、「辞書のリスト」のリストのデータでしたので!
guest

回答2

0

元のリストは変更したくないとかでなければ、今の形のほうがわかりやすいと思いますが、
内包で書き直すならこうでしょうか。

python

1jst = datetime.timezone(datetime.timedelta(hours=+9)) 2new_lst = [[dict(x, b=x['b'].astimezone(jst)) for x in v] for v in lst]

dict()をキーワード引数で呼ぶと、値を置き換えた新しい辞書を作成できます。
https://docs.python.org/ja/3/library/stdtypes.html#dict

投稿2021/04/15 05:13

bsdfan

総合スコア4794

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

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

0

結果を使わない内包表記を使えば、できないこともありません。

python

1>>> def repb(v): v['b'] = v['b'].astimezone(datetime.timezone(datetime.timedelta(hours=+9))) 2... 3>>> print(lst) 4[{'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 0), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}, {'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 0), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}] 5>>> [repb(v) for v in lst] 6[None, None] 7>>> print(lst) 8[{'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}, {'a': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'b': datetime.datetime(2021, 4, 15, 10, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400))), 'c': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'd': 0, 'e': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}]

投稿2021/04/15 04:48

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問