我是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)]
答案 0 :(得分:0)
怎么样?
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])