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

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

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

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

Q&A

解決済

2回答

233閲覧

Python:内包表記を用いたlistの書き換え

TeRa_130

総合スコア61

Python

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

0グッド

0クリップ

投稿2019/07/06 13:36

前提・実現したいこと

Pythonを使用しています。

  • 実現したい内容 …

「 listを内包表記を用いてb[i][1]の中にa[i][1]の情報があった時、
b[i][0]の情報をa[i][0]の情報に書き換えたいのですがうまくいきません。

これを解決したいです。」

実行したコードとその結果

実行したコード

このようなコードを実行しました。

python

1In[]: 2a = [['u', 0], ['u', 2], ['u', 4], ['u', 6], ['u', 8]] 3b = [['n', 1], ['n', 2], ['n', 3], ['n', 4], ['n', 5]] 4 5target = {y1 for x1,y1 in a if x1 !=0 } 6way_li = [[x1[0], x1[1]] if x1[1] in target else x1 for x1 in b] 7 8way_li

実行した結果

上記のコードを実行した結果、
以下のようになりました。

python

1Out[]: 2[['n', 1], ['n', 2], ['n', 3], ['n', 4], ['n', 5]]

本来得たい結果

望んでいた実行結果は以下の通りです。

python

1Out[]: 2[['n', 1], ['u', 2], ['n', 3], ['u', 4], ['n', 5]]

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

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

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

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

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

guest

回答2

0

ベストアンサー

冷静に考えてみてもらえるとわかるとおり、

python

1way_li = [[x1[0], x1[1]] if x1[1] in target else x1 for x1 in b]

の行で[x1[0], x1[1]]にしろx1にしろ同じものです。

[x1[0], x1[1]]と書く代わりに手打ちで["u", x1[1]]とするのが一つの手。でも、これだと要件を厳密に満たさないので(違うフォーマットのデータに対応できない)、その辺りを勘案すると、こうなりますかね。

python

1a = [['u', 0], ['u', 2], ['u', 4], ['u', 6], ['u', 8]] 2b = [['n', 1], ['n', 2], ['n', 3], ['n', 4], ['n', 5]] 3 4target = {y:[x, y] for x, y in a} # 辞書にして保存 5way_li = [target.get(y, [x, y]) for x, y in b] # 辞書のgetメソッドでキーの有無を判定し、あれば置き換える 6 7print(way_li)

投稿2019/07/06 13:53

hayataka2049

総合スコア30933

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

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

TeRa_130

2019/07/06 13:59

違うフォーマットの対応まで対応いただき、 ありがとうございます。
guest

0

註:
この回答は、『b[i][1]の中にa[i][1]の情報があった時』という条件を素直に満たすものです。
ただし既にご指摘があるように、質問者さんの望む処理では無いようです。

aとbをzipを使って並行して巡回し、
条件を満たすときはaの要素を、そうでないときはbの要素を選択すれば良いでしょう。

Python

1way_li = [ 2 ea if ea[1] == eb[1] else eb 3 for ea, eb in zip(a, b) 4]

これは次のように書いているのと同じロジックです。

Python

1way_li = [] 2for ea, eb in zip(a, b): 3 if ea[1] == eb[1]: 4 way_li.append(ea) 5 else: 6 way_li.append(eb)

投稿2019/07/06 13:40

編集2019/07/06 14:02
LouiS0616

総合スコア35660

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

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

hayataka2049

2019/07/06 13:54

インデックス3の要素を['u', 4]にしたいらしいので、これではないのだと思います。私もこっちで回答しかけてから気づきましたけど。
LouiS0616

2019/07/06 13:57

ほんとですね。気付きませんでした。 ご指摘ありがとうございます。
TeRa_130

2019/07/06 13:58

ありがとうございます。 条件分岐をすればわざわざ2つのコードを行き来しなくて済みますね。
LouiS0616

2019/07/06 14:38 編集

読み違えた身でケチを付けるのも恐縮ですが、 『b[i][1]がa[~][1]に含まれるとき』とか『b[i][1]がa[k][1]に含まれるとき』というような書き方だったら意図が伝わり易かったんじゃないかなぁ、と思います。
TeRa_130

2019/07/06 16:03

確かに私の書き方も悪かったかもしれません。 ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問