我有一个这样的列表:
A = [[2, 3], 5, 7, 8, [2, 3], 1, [9, 2]]
我想比较嵌套列表中的所有值 ([2, 3], ..., [2, 3], ..., [9, 2]) 并提取出现一次的数字,在本例中为 9 ,如果您发现一个仅出现在列表中的一个列表中的数字。这就是该块的答案,即:
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]]
如果您想提取仅出现在一个子列表中的值,无论它们在该子列表中出现多少次,您都可以这样做:
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]
如果您想提取一个仅出现在一个子列表中且仅在该子列表中出现一次的数字,即它仅在所有子列表的所有元素中出现一次,您可以更改此行:
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]]