我有一份清单
list = [[-2.0, 5.0], [-1.0, -3.0], [1.0, 3.0], [2.0, -5.0]]
我想要做的是删除一个相同值的元素,我应该将第一个元素与第二个元素分开。例如[-2.0, 5.0] = -2/5
和[2.0, -5.0] = -2/5
。我想删除[-2.0, 5.0]
或[2.0, -5.0]
,因为它们会产生相同的值。
有什么想法吗?
答案 0 :(得分:1)
我可以尝试这样:
元组可能是一个字典键,所以我在更改为abs后将列表转换为元组 list元素的值,并将原始列表保留为值。
>>> lis
[[-2.0, 5.0], [-1.0, -3.0], [1.0, 3.0], [2.0, -5.0]]
>>> dict([(tuple([abs(x[0]), abs(x[1])]), x) for x in lis]).values()
[[2.0, -5.0], [1.0, 3.0]]
>>>
答案 1 :(得分:0)
假设您的所有值都是浮点数(因此您始终可以使用浮点除法),您可以执行以下操作:
my_list = [[-2.0, 5.0], [-1.0, -3.0], [1.0, 3.0], [2.0, -5.0]]
values_seen = []
new_list = []
for x,y in my_list:
if x/y in values_seen:
continue
else:
values_seen.append(x/y)
new_list.append([x,y])
现在,您想要的列表将存储为new_list
。请注意,您应该避免像上面那样为关键字list
写一个值。
*澄清,我假设如果你有两个以上的值返回相同的比例(例如[[1,3],[2,6],[3,9]]
),你只想保留其中一个。
答案 2 :(得分:0)
如果你想消除所有等效分数(意味着[-2.0,5.0]和[4.0,-10.0]被认为是等价的),那么下面的代码就可以了。
seen = set()
for numerator, denominator in lst:
quotient = numerator / denominator
if quotient not in seen:
seen.add(quotient)
yield numerator, denominator
否则,如果您希望最终列表包含[-2.0,5.0]和[4.0,-10.0]:
seen = set()
for numerator, denominator in lst:
value = (abs(numerator), abs(denominator), sign(numerator)*sign(denominator))
if value not in seen:
seen.add(value)
yield numerator, denominator
如果你是用Python编写的,这是一种缺少sign
函数的语言,你需要使用math.copysign或(numerator > 0) ^ (denominator > 0)
,其中^
是xor运算符。
此代码假设分子和分母都非零。
如果你真的要保留一个分子 - 分母数字对的列表,可以考虑将这些对存储为不可变元组,或者更好地存储为Python fractions。
答案 3 :(得分:0)
快速而肮脏的方式,因为词典中的键是唯一的。
{num/denom : [num, denom] for (num, denom) in lst}.values()
通常,使用==比较浮点数是不可靠的,通常最好检查它们是否在公差范围内。例如
abs(x-y) < tolerance
更强大的方式可能如下所示。附加到for循环的else只是意味着这样做,除非你提前退出循环。它非常方便。然而,这个版本是二次而不是线性时间。
div = lambda x,y : x/y
unique = []
for j in range(len(lst)):
for i in range(j):
if abs( div(*lst[i])-div(*lst[j]) ) < tolerance:
break
else
unique.append(lst[j])
unique
答案 4 :(得分:0)
我首先会使用set
获得一组独特的比率:
In [1]: lst = [[-2.0, 5.0], [-1.0, -3.0], [1.0, 3.0], [2.0, -5.0]]
In [2]: rs = list(set([ l[0]/l[1] for l in lst]))
然后只过滤出比率的第一次出现:
In [3]: [ filter(lambda m: m[0]/m[1] == r , lst )[0] for r in rs ]
Out[3]: [[-2.0, 5.0], [-1.0, -3.0]]
In [4]: