删除相似的元素,但通过循环留下唯一的元素

时间:2017-07-09 02:52:46

标签: python

我必须从未排序的列表中删除类似的元素,如下所示。

[(579, 271, 97, 114), (580, 271, 97, 114), (578, 272, 97, 114), (579, 272, 97, 114), (580, 272, 97, 114), (581, 272, 97, 114), (577, 273, 97, 114), (578, 273, 97, 114), (579, 273, 97, 114), (580, 273, 97, 114), (581, 273, 97, 114), (582, 273, 97, 114), (577, 274, 97, 114), (578, 274, 97, 114), (579, 274, 97, 114), (580, 274, 97, 114), (581, 274, 97, 114), (582, 274, 97, 114), (577, 275, 97, 114), (578, 275, 97, 114), (579, 275, 97, 114), (580, 275, 97, 114), (581, 275, 97, 114), (578, 276, 97, 114), (579, 276, 97, 114), (580, 276, 97, 114), (581, 276, 97, 114), (579, 277, 97, 114), (22, 460, 97, 114), (23, 460, 97, 114), (133, 460, 97, 114), (134, 460, 97, 114), (21, 461, 97, 114), (22, 461, 97, 114), (23, 461, 97, 114), (24, 461, 97, 114), (132, 461, 97, 114), (133, 461, 97, 114), (134, 461, 97, 114), (135, 461, 97, 114), (20, 462, 97, 114), (21, 462, 97, 114), (22, 462, 97, 114), (23, 462, 97, 114), (24, 462, 97, 114), (131, 462, 97, 114), (132, 462, 97, 114), (133, 462, 97, 114), (134, 462, 97, 114), (135, 462, 97, 114), (136, 462, 97, 114), (20, 463, 97, 114), (21, 463, 97, 114), (22, 463, 97, 114), (23, 463, 97, 114), (24, 463, 97, 114), (131, 463, 97, 114), (132, 463, 97, 114), (133, 463, 97, 114), (134, 463, 97, 114), (135, 463, 97, 114), (136, 463, 97, 114), (20, 464, 97, 114), (21, 464, 97, 114), (22, 464, 97, 114), (23, 464, 97, 114), (24, 464, 97, 114), (131, 464, 97, 114), (132, 464, 97, 114), (133, 464, 97, 114), (134, 464, 97, 114), (135, 464, 97, 114), (136, 464, 97, 114), (21, 465, 97, 114), (22, 465, 97, 114), (23, 465, 97, 114), (132, 465, 97, 114), (133, 465, 97, 114), (134, 465, 97, 114), (135, 465, 97, 114), (22, 466, 97, 114), (133, 466, 97, 114), (134, 466, 97, 114)]

我希望首先在头部中保留唯一元素,但删除差异为5的元素。

我编写了一个函数比较每个元素之间的差异,但它不断变大。

def compare_remove(input_list):
    cnt = 0
    glob_cnt = 0
    output_list = [input_list[0]]

    while True:

        for i in range(len(input_list)):
            if i <= cnt:
                print 'jump || '
                continue

            if abs(output_list[cnt][0] - input_list[i][0]) <= 5:
                if abs(output_list[cnt][0] - input_list[i][0]) == 0:
                    continue

                print 'skip ||' + str(output_list[cnt]) +' || ' + str(input_list[i])
                continue
            else:
                print 'append || ' + str(input_list[i])
                output_list.append(input_list[i])

        print 'loop out || '
        input_list = output_list
        cnt+=1

        if cnt == 100:
            break
        try:
            output_list[cnt]
        except:
            break

    return output_list

它比较元素的第一个元素,以及之前的元素之间的差异,将其删除。

2 个答案:

答案 0 :(得分:0)

我不确定我是否理解了这个问题,但是这里是留下独特元素的代码首先出现在头部,但删除了差异为5的元素。

input=[(579, 271, 97, 114), (580, 271, 97, 114), (578, 272, 97, 114), (579, 272, 97, 114), (580, 272, 97, 114), (581, 272, 97, 114), (577, 273, 97, 114), (578, 273, 97, 114), (579, 273, 97, 114), (580, 273, 97, 114), (581, 273, 97, 114), (582, 273, 97, 114), (577, 274, 97, 114), (578, 274, 97, 114), (579, 274, 97, 114), (580, 274, 97, 114), (581, 274, 97, 114), (582, 274, 97, 114), (577, 275, 97, 114), (578, 275, 97, 114), (579, 275, 97, 114), (580, 275, 97, 114), (581, 275, 97, 114), (578, 276, 97, 114), (579, 276, 97, 114), (580, 276, 97, 114), (581, 276, 97, 114), (579, 277, 97, 114), (22, 460, 97, 114), (23, 460, 97, 114), (133, 460, 97, 114), (134, 460, 97, 114), (21, 461, 97, 114), (22, 461, 97, 114), (23, 461, 97, 114), (24, 461, 97, 114), (132, 461, 97, 114), (133, 461, 97, 114), (134, 461, 97, 114), (135, 461, 97, 114), (20, 462, 97, 114), (21, 462, 97, 114), (22, 462, 97, 114), (23, 462, 97, 114), (24, 462, 97, 114), (131, 462, 97, 114), (132, 462, 97, 114), (133, 462, 97, 114), (134, 462, 97, 114), (135, 462, 97, 114), (136, 462, 97, 114), (20, 463, 97, 114), (21, 463, 97, 114), (22, 463, 97, 114), (23, 463, 97, 114), (24, 463, 97, 114), (131, 463, 97, 114), (132, 463, 97, 114), (133, 463, 97, 114), (134, 463, 97, 114), (135, 463, 97, 114), (136, 463, 97, 114), (20, 464, 97, 114), (21, 464, 97, 114), (22, 464, 97, 114), (23, 464, 97, 114), (24, 464, 97, 114), (131, 464, 97, 114), (132, 464, 97, 114), (133, 464, 97, 114), (134, 464, 97, 114), (135, 464, 97, 114), (136, 464, 97, 114), (21, 465, 97, 114), (22, 465, 97, 114), (23, 465, 97, 114), (132, 465, 97, 114), (133, 465, 97, 114), (134, 465, 97, 114), (135, 465, 97, 114), (22, 466, 97, 114), (133, 466, 97, 114), (134, 466, 97, 114)]
srt_input=sorted(input)
mini=srt_input[0][0]
output=[srt_input[0]]
for i in srt_input:
    if i[0]<=mini+5:continue
    mini=i[0]
    output.append(i)
print(output)
---------
[(20, 462, 97, 114), (131, 462, 97, 114), (577, 273, 97, 114)]

你可以选择最小值,并忽略下一个人的头部&lt;选择了一个人的头+5 如果这不是您想要的,请告诉我您的预期结果。

答案 1 :(得分:0)

如果您只是想删除重复项,可以试试这个:

tosort = [ 5, 6, 7, 21, 5, 9, 6, 9]
seen = []
for num in tosort:
    if not (num in seen):
         seen.append(num)
print(seen)