Как заменить кортеж в отсортированном списке кортежей на основе первого значения Python - PullRequest
1 голос
/ 09 мая 2019

Я новичок в 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)]

1 Ответ

0 голосов
/ 09 мая 2019

Как насчет этого?

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