これ、条件を2つ書いていますが実質同じですよね。
list[x][0]及びlist[x][1]が重複しているものしかない場合にlistから除外
解釈: タプル0の値でグルーピングして、タプル1の値が1種類なら、除外
そもそもリスト内に一つしかないtupleをlistから除外
逆に、list[x][0]が'3aa'のものは1つしか無いので除外
解釈: タプル0の値でグルーピングして、タプル1の値が1種類なら、除外
この解釈でよければ以下のように書けます。
Python
1>>> data = [ # listだとlist関数を隠蔽するのでdataにします
2... ('1aa', '1bb', '1cc', 123,),
3... ('1aa', '1bb', '4cc', 012,),
4... ('1aa', '3bb', '3cc', 789,),
5... ('2aa', '2bb', '2cc', 123,),
6... ('2aa', '2bb', '2cc', 456,),
7... ('3aa', '3bb', '3cc', 456,),
8... ]
9...
10
11>>> # 除外条件を求めるために、タプル0でタプル1をグルーピング
12>>> conditions = {}
13>>> for d in data:
14... if d[0] not in conditions:
15... conditions[d[0]] = set()
16... conditions[d[0]].add(d[1])
17...
18>>> conditions
19{'3aa': set(['3bb']), '1aa': set(['3bb', '1bb']), '2aa': set(['2bb'])}
20
21>>> # タプル1が1つしかない行をタプル0で特定して削除
22>>> for key in conditions:
23... if len(conditions[key]) == 1:
24... data = [x for x in data if x[0] != key]
25
26>>> # 結果
27>>> data
28[('1aa', '1bb', '1cc', 123), ('1aa', '1bb', '4cc', 10), ('1aa', '3bb', '3cc', 789)]
(おまけ)これを短く書きなおしてみます。
Python
1>>> data = [ # listだとlist関数を隠蔽するのでdataにします
2... ('1aa', '1bb', '1cc', 123,),
3... ('1aa', '1bb', '4cc', 012,),
4... ('1aa', '3bb', '3cc', 789,),
5... ('2aa', '2bb', '2cc', 123,),
6... ('2aa', '2bb', '2cc', 456,),
7... ('3aa', '3bb', '3cc', 456,),
8... ]
9...
10>>> for k, d in groupby(data, itemgetter(0)):
11... if len(set(itemgetter(1)(x) for x in d)) == 1:
12... data = [x for x in data if x[0] != k]
13...
14>>> data
15[('1aa', '1bb', '1cc', 123), ('1aa', '1bb', '4cc', 10), ('1aa', '3bb', '3cc', 789)]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/24 09:12