删除特定索引相同的多个集合的所有列表

时间:2015-07-23 11:25:39

标签: python python-2.7

对象:给定多组2d数组,删除每个数组中与任何数组中特定索引共享公共值的所有项。

数据很大,大约有20组,每组有200k个数组,其中每个数组都有大量数据。

我知道两套

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中与bc中的项匹配的所有项的索引,我可以将其删除。我可以用循环来做这个,但这似乎效率低下(没有矢量化?)。

假设:

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]]

1 个答案:

答案 0 :(得分:2)

您可以使用计数器字典来计算每个第一个元素在每个子列表中出现的次数,然后只保留第一个元素出现一次的子列表。

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]]