【问题标题】:How to replace a tuple in sorted list of tuples basing on first value Python如何根据第一个值Python替换已排序的元组列表中的元组
【发布时间】:2019-09-27 15:56:24
【问题描述】:

我是python新手,正在寻求解决以下问题的帮助

我需要根据提供的数据创建一个排序的元组/字典列表。然后,当提供新数据并且具有相同的第一个键时,我想用新的值替换它的值。为了更清楚,我将举个例子......想象一下我有数据,如下所示:

data = [(1, 100), (2, 200), (4, 400), (7, 900)]

然后我有来自用户的新条目,例如:

(4,500)

所以,现在我想用(4,400) 替换这个元组,用(4,500) 替换这个元组。我知道元组是不可变的,因此我不想更新任何内容,只需根据键(此处:4)删除前一个并用新元组替换它。

到目前为止,我使用了另一个堆栈中的一个类,它以排序方式将每个新条目(元组)插入到元组列表中,我希望它保持这种状态,因为我需要进一步计算最接近的较低和较高的数字如果它不在列表中,则提供一个。

我的代码如下:

from bisect import bisect_left


class KeyWrapper:
    def __init__(self, iterable, key):
        self.it = iterable
        self.key = key

    def __getitem__(self, i):
        return self.key(self.it[i])

    def __len__(self):
        return len(self.it)

data = [(1, 100), (2, 200), (4, 400), (7, 900)]
data.sort(key=lambda c: c[0])

newcol = (3, 500)

bslindex = bisect_left(KeyWrapper(data, key=lambda c: c[0]), newcol[0])
data.insert(bslindex, newcol)

输出如下:

[(1,100),(2,200),(3,500),(4,400),(7,900)]

并为 ex 提供新变量。 newcols2 = (3,600),基于元组的第一个元素(这里是 3) 我想输出如下:

[(1,100),(2,200),(3,600),(4,400),(7,900)]

【问题讨论】:

  • 为什么不使用 OrderedDict?您的解决方案非常复杂和奇怪。

标签: python python-3.x list replace tuples


【解决方案1】:

这个怎么样?

data = [(1, 100), (2, 200), (4, 400), (7, 900)]
new = (4, 500)

# Filter out matching
data = [i for i in data if i[0] != new[0]]
# Add the new
data.append(new)
# Re-sort
data = sorted(data, key=lambda x: x[0])

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2015-06-15
    • 2022-01-24
    • 2011-05-21
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多