列表列表中的相等元素。删除一个

时间:2014-09-26 03:37:16

标签: python

我有一份清单

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],因为它们会产生相同的值。

有什么想法吗?

5 个答案:

答案 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]: