今天遇到一个问题,纠结一段时间后终于想到一个方法,挺开心的,就记录下。
问题简化之后是这样的:对于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开始比较,然后在遇到第一个满足重复的条件时停止,其实我也不知道这样是否能让运算量稍微小点。
因为一开始只是得出列表号,所以列表并没被改变,对于第三次出现的值我们会通过比较第二个重复值时找到列表号。
当时处理的列表长度貌似只是几万条,所以时间还好。
临时想的方案肯定有很多待完善处,如果有同学发现哪里错了或者有更好的办法也希望能告知下啦。
在永不停歇的变化之中,总有一种东西存活在我们脚下,我们只看到花开花落,而生命的树跟却岿然不动,万古长青。