次のようなリストがあります。
A = [[2, 3], 5, 7, 8, [2, 3], 1, [9, 2]]
ネストされたリスト ([2, 3], ..., [2, 3], ..., [9, 2]) 内のすべての値を比較し、1 回出現する数字、この場合は 9 を抽出したい、リスト内の 1 つのリストにのみ表示される番号が見つかった場合。それがそのブロックの答えです。
A = [[2, 3], 5, 7, 8, [2, 3], 1, [9]]
乱雑で読みにくいリストの理解ですが、他の答えはとても長いです!
リストメンバーが整数の場合、またはすべてのサブリストの結合リストで複数回出現するメンバーのみを持つサブリストの場合は、リストメンバーを含めます。それ以外の場合、つまり、すべてのサブリストで一意のメンバーを持つサブリストの場合は、そのサブリストの一意のメンバーのみを含めます。
>>> A = [[2, 3], 5, 7, 8, [2, 3], 1, [9, 2]]
>>> L = [y for x in A if type(x) == list for y in x]
>>>> [x if (type(x) == int) else x if all([L.count(y) > 1 for y in x]) \
else [y for y in x if L.count(y) == 1] for x in A]
[[2, 3], 5, 7, 8, [2, 3], 1, [9]]
1つのサブリストにのみ表示される値を抽出する場合は、そのサブリストに何度表示されるかに関係なく、次のように実行できます。
from collections import Counter
def get_answer(x):
my_list = []
for ele in x:
if isinstance(ele, list):
my_list.extend(list(set(ele)))
countz = Counter(my_list)
return [k for k,v in countz.iteritems() if v == 1]
結果:
>>> get_answer([[2, 3], 5, 7, 8, [2, 3], 1, [9, 9]])
[9]
>>> get_answer([[2, 3], 5, 7, 8, [2, 3], 1, [9, 2]])
[9]
1つのサブリストにのみ表示され、そのサブリストに1回だけ表示される番号を抽出する場合、つまり、すべてのサブリストのすべての要素に1回だけ表示される場合は、次の行を変更します。
my_list.extend(list(set(ele)))
に
my_list.extend(ele)
これは、あなたの望むことですか?
import collections
A = [[2, 3], 5, 7, 8, [2, 3], 1, [9, 2]]
B = []
occurences = collections.defaultdict(lambda: 0)
for element in A:
if type(element) is list:
B.append(element)
for sublist in B:
for number in sublist:
occurences[number] += 1
for sublist in B:
for number in sublist:
if occurences[number] == 1:
del sublist[:]
sublist.append(number)
print(A)
結果:
[[2, 3], 5, 7, 8, [2, 3], 1, [9]]