今天遇到一個問題,糾結一段時間后終於想到一個方法,挺開心的,就記錄下。
問題簡化之后是這樣的:對於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開始比較,然后在遇到第一個滿足重復的條件時停止,其實我也不知道這樣是否能讓運算量稍微小點。
因為一開始只是得出列表號,所以列表並沒被改變,對於第三次出現的值我們會通過比較第二個重復值時找到列表號。
當時處理的列表長度貌似只是幾萬條,所以時間還好。
臨時想的方案肯定有很多待完善處,如果有同學發現哪里錯了或者有更好的辦法也希望能告知下啦。