列表中的相等元素。删除时间

2024-04-19 12:47:07 发布

您现在位置: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],因为它们产生相同的值。你知道吗

有什么想法吗?你知道吗


Tags: 元素list单子
3条回答

假设所有值都是浮点值(因此可以始终使用浮点除法),可以执行以下操作:

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。你知道吗

*澄清一下,我假设如果您有超过2个返回相同比率的值(例如[[1,3],[2,6],[3,9]]),您将只希望保留其中一个。你知道吗

我可以这样试一下吗:

Tuple可能是一个字典键,所以我在更改为abs之后将列表转换为Tuple 列表元素的值,并保留原始列表作为值。你知道吗

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

如果您想消除所有等价的分数(意味着[-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。你知道吗

相关问题 更多 >