今天遇到一个问题,纠结一段时间后终于想到一个方法,挺开心的,就记录下。

问题简化之后是这样的:对于python中类似这样的一个列表

[{'A':2,'B':3,'C':4},{'A':2,'B':4,'C':5},{'A':2,'B':3,'C':5},{'A':2,'B':3,'C':6}]

其中列表的每个元素是有相同结构的字典,我想找出字典中A与B的组合是唯一的列表,C不同时选择最初的那个。

我希望得到的最后结果是这样的[{'A':2,'B':3,'C':4},{'A':2,'B':4,'C':5}]

如果是大家遇到这样的问题会怎么处理呢?

我的想法是先找到重复的列表号,然后再删除这些列表值。如上例中则先找到[2,3],不说太多,先把代码给上把。

del_id = [] 
for i in range(len(test_list)):
    j = i+1;
    while(j and j!=len(test_list)):
        if (test_list[j]['A'] == test_list[i]['A']) and  (test_list[j]['B'] == test_list[i]['B']):
            del_id.append(j)
            j = 0
        else:
            j = j+1
de = 0
for item in del_id:
    id_de = item - de
    del test_list[id_de]
    de += 1

上面代码挺简单的,主要是有两点一个是j从i+1开始比较,然后在遇到第一个满足重复的条件时停止,其实我也不知道这样是否能让运算量稍微小点。

因为一开始只是得出列表号,所以列表并没被改变,对于第三次出现的值我们会通过比较第二个重复值时找到列表号。

当时处理的列表长度貌似只是几万条,所以时间还好。

临时想的方案肯定有很多待完善处,如果有同学发现哪里错了或者有更好的办法也希望能告知下啦。

 

在永不停歇的变化之中,总有一种东西存活在我们脚下,我们只看到花开花落,而生命的树跟却岿然不动,万古长青。