Python-从列表中删除与另一个元素相似的元素

时间:2018-06-22 15:33:38

标签: list

这听起来很简单,但是我遇到了麻烦。我有一个包含一些值的列表,其中一些可能相似。如果两个或多个值彼此相似,则我想删除其中一个值,但除其中一个之外的所有值。例如对于列表a,

a = [10,45,48,120]

说,我想删除一个值,如果它与另一个值的大小相似为5。因此,在这种情况下,我希望删除45或48,这无关紧要。我可以设想找到每个元素与每个其他元素之间的绝对差异,即遍历列表本身,并根据每个元素与每个其他元素之间的差异创建一个新列表,例如

import copy
a = [10,45,48,120]
a_new=[]

for val in a:
    for val_ in a:
        dif = abs(val-val_)
        if dif == 0:
            a_new.append(val_)
        elif dif > 5:
            a_new.append(val_)
    a=copy.deepcopy(a_new)
    a_new=[]

在这里,我尝试将结果反馈到循环中,但没有得到想要的结果。我得到:

a
[10,120]

我想要的是:

a
[10,45,120]

1 个答案:

答案 0 :(得分:1)

通过在代码执行期间检查这些值,我们可以看到当val = 45和val_ = 48时,没有将48添加到a_new中。然后,当val = 48时,a不包含48,因此48永远不会附加到a_new,并且48-45 <3,所以45也不会附加到a_new。

import copy
a = [10,45,48,120]
a_new=[]

for val in a:
    print('outer loop: a: {}'.format(a))
    for val_ in a:
        dif = abs(val-val_)
        if dif == 0:
            a_new.append(val_)
        elif dif > 5:
            a_new.append(val_)
        print('val: {:3d}, val_: {:3d}, dif: {:3d}, a: {}, a_new: {}'.format(val, val_, dif, a, a_new))
    a=copy.deepcopy(a_new)
    a_new=[]

outer loop: a: [10, 45, 48, 120]
val:  10, val_:  10, dif:   0, a: [10, 45, 48, 120], a_new: [10]
val:  10, val_:  45, dif:  35, a: [10, 45, 48, 120], a_new: [10, 45]
val:  10, val_:  48, dif:  38, a: [10, 45, 48, 120], a_new: [10, 45, 48]
val:  10, val_: 120, dif: 110, a: [10, 45, 48, 120], a_new: [10, 45, 48, 120]
outer loop: a: [10, 45, 48, 120]
val:  45, val_:  10, dif:  35, a: [10, 45, 48, 120], a_new: [10]
val:  45, val_:  45, dif:   0, a: [10, 45, 48, 120], a_new: [10, 45]
val:  45, val_:  48, dif:   3, a: [10, 45, 48, 120], a_new: [10, 45]
val:  45, val_: 120, dif:  75, a: [10, 45, 48, 120], a_new: [10, 45, 120]
outer loop: a: [10, 45, 120]
val:  48, val_:  10, dif:  38, a: [10, 45, 120], a_new: [10]
val:  48, val_:  45, dif:   3, a: [10, 45, 120], a_new: [10]
val:  48, val_: 120, dif:  72, a: [10, 45, 120], a_new: [10, 120]
outer loop: a: [10, 120]
val: 120, val_:  10, dif: 110, a: [10, 120], a_new: [10]
val: 120, val_: 120, dif:   0, a: [10, 120], a_new: [10, 120]

除了构建新列表之外,您只需删除不符合条件的值即可实现目标。

a = [10,45,48,120]
for val in a:
    for val_ in a[1:]:
        dif = abs(val - val_)
        if dif > 0 and dif <= 5:
            a.remove(val_)