list - Python - 如果元素与另一个元素相似,则从列表中删除该元素

标签 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]

最佳答案

通过在代码执行时检查值,我们可以看到当 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_)

关于list - Python - 如果元素与另一个元素相似,则从列表中删除该元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50991311/

相关文章:

r - 从 R 中的列表中过滤值

python - 创建不同类型的嵌套列表的快速方法: numpy, pandas或列表串联?

python - 如何在 Python 中找到一个元素在列表中的位置?

python:比较2个实例列表

.net - 什么时候分配新列表比 .Clear() 现有列表更合适?

java - 根据属性值从单个对象列表重建列表

python - 列出元素而不手动指定它们

c++ - 从文件读取数据到链表很慢

list - 具有一对多关系的GORM createCriteria

python - 对元组列表进行排序,元组的第二个元素是列表