这听起来很简单,但是我遇到了麻烦。我有一个包含一些值的列表,其中一些可能相似。如果两个或多个值彼此相似,则我想删除其中一个值,但除其中一个之外的所有值。例如对于列表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]
答案 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_)