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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1057閲覧

二次元配列のリストの要素を比較し、削除したい

nijihan

総合スコア19

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/12/15 06:26

編集2019/12/15 10:34

python初心者です。

python

1A = [['apple','Apple'], 2   ['APPLE','Apple'], 3   ['APPLE','APPLE'], 4   ['banana','Banana'], 5   ['ORANGE','orange'], 6   ['grape','Grape'], 7   ['GRAPE','Grape']]

Aのような二次元配列のリストがあります。行いたい処理は以下の通りです。

①先頭の要素を比較して、大文字と小文字の違いのみであれば同じとみなし(この場合は'apple'='APPLE','grape'='GRAPE')、その要素を含むリストを丸ごと削除する
②ただし①に当てはまっても、1番目の要素が異なれば削除しない(最後の要素は'Apple' != 'APPLE'なので、上の2つとは異なるとみなし、削除しない)
③残った要素を表示

python

1result = [['APPLE','APPLE'],['banana','Banana'],['ORANGE','orange']]

このような結果が得られることを期待しています。
どのような処理をしたらよいのかご教示お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

いまひとつ 値を残す条件がよくわかりませんが、質問文の入力配列から出力配列を得るコードを書いてみました。

cc.py

python3

1 ['apple','Apple'], 2 ['APPLE','Apple'], 3 ['APPLE','APPLE'], 4 ['banana','Banana'], 5 ['ORANGE','orange'], 6 ['grape','Grape'], 7 ['GRAPE','Grape'] 8] 9 10result = [] 11 12last_key = data[0][0].upper() 13buffer = [] 14for k, v in data: 15 if k.upper() == last_key: 16 buffer.append([k, v]) 17 continue 18 19 last_key = k.upper() 20 21 if len(buffer) == 1: 22 result.append(buffer) 23 else: 24 last_val = buffer[0][1] 25 for k1, v1 in buffer: 26 if v1 != last_val: 27 result.append([k1, v1]) 28 last_val = v1 29 30 buffer = [[k, v]] 31 32print(result)

実行結果
イメージ説明

投稿2019/12/17 14:58

編集2019/12/17 14:59
katoy

総合スコア22324

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

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

0

出現回数を数える辞書を用意すれば良いです。

Python

1src = [ 2 ['apple', 'Apple'], ['APPLE', 'Apple'], ['banana', 'Banana'], ['ORANGE', 'orange'] 3] 4 5# 6counter = {} 7for e in src: 8 key = e[0].lower() 9 if key in counter: 10 counter[key] += 1 11 else: 12 counter[key] = 1 13 14print(counter) 15 16# 17dst = [] 18for e in src: 19 key = e[0].lower() 20 if counter[key] > 1: 21 continue 22 23 dst.append(e) 24 25print(dst)

実行結果 Wandbox

{'apple': 2, 'banana': 1, 'orange': 1} [['banana', 'Banana'], ['ORANGE', 'orange']]

慣れればこんなふうにも書けます。

Python

1import collections 2 3src = [ 4 ['apple', 'Apple'], ['APPLE', 'Apple'], ['banana', 'Banana'], ['ORANGE', 'orange'] 5] 6 7# 8counter = collections.Counter(k.lower() for k, *_ in src) 9dst = [e for e in src if counter[e[0].lower()] == 1] 10 11print(dst)

Wandbox

投稿2019/12/15 07:25

LouiS0616

総合スコア35660

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

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

nijihan

2019/12/15 08:51

実際のデータ(Aは1500要素あります)で処理をしたところ問題が生じたので、条件②を追加しました。それに伴ってAの要素も追加しました。お手数ですが、回答して頂いたプログラムをどのように変更したらよいか教えて頂けないでしょうか。
LouiS0616

2019/12/15 09:39

どんな実行結果になれば良いのですか?
nijihan

2019/12/15 10:35

質問の期待する結果の部分を変更しました。ご覧いただけるとありがたいです。
LouiS0616

2019/12/15 10:40

e[0].lower() の代わりに (e[0].lower(), e[1]) あたりをキーにすれば良さそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問