对象:给定多组二维数组,删除每个数组中在任何数组的特定索引中共享公共(public)值的所有项。
数据量大,20组左右,每组20万个数组,每个数组中的数据量很大。
我对两组的了解
a = [['a',10,11],['b',10,11],['c',10,11]]
b = [['e',10,11],['a',12,11],['f',10,11]]
c = [['aa',10,11],['b',10,11],['cc',10,11]]
first = []
second = []
for i in range(len(a)):
first.append(a[i][0])
for i in range(len(b)):
second.append(b[i][0])
AA = set(map(tuple,first))
BB = set(map(tuple,second))
print AA
print BB
print BB.symmetric_difference(AA)
我可以获得一个新集合,其中包含基于数组中每个项目(数组)的第一个索引的唯一项目。但是,我想从每个集合中删除任何其他集合中存在的项目,而不仅仅是两个集合之间的项目,而不仅仅是创建一个新集合。
如果我可以获取 a 中与 b 或 c 中的项目匹配的所有项目的索引,我可以删除它们。我可以用循环来做到这一点,但这似乎效率低下(不是矢量化的?)。
给定:
a = [['a',10,11],['b',10,11],['c',10,11]]
b = [['e',10,11],['a',12,11],['f',10,11]]
c = [['aa',10,11],['b',10,11],['cc',10,11]]
输出将是
a = [['c',10,11]]
b = [['e',10,11],['f',10,11]]
c = [['aa',10,11],['cc',10,11]]
请您参考如下方法:
您可以使用计数器字典来计算每个第一个元素在每个子列表中出现的次数,然后只保留第一个元素出现一次的子列表。
from collections import Counter
# count how many times each sublists first element appears in all sublists
keys = Counter((ele[0] for sub in (a,b,c) for ele in sub))
for l in (a, b, c):
for sub in reversed(l):
# if the count is not 1 then it is not unique so remove it
if keys[sub[0]] != 1:
l.remove(sub)
print (a)
print(b)
print(c)
输出:
[['c', 10, 11]]
[['e', 10, 11], ['f', 10, 11]]
[['aa', 10, 11], ['cc', 10, 11]]
如果您想保留原始列表,只需附加到新列表而不是从原始列表中删除。
如果 a 有另一个以 c 作为第一个元素的子列表,您将得到一个空列表:
a = [['a',10,11],['b',10,11],['c',10,11],["c",3,4]]
b = [['e',10,11],['a',12,11],['f',10,11]]
c = [['aa',10,11],['b',10,11],['cc',10,11]]
输出:
[]
[['e', 10, 11], ['f', 10, 11]]
[['aa', 10, 11], ['cc', 10, 11]]
