Индекс списка соответствий на основе его значения

Я новичок в Python и работаю над проблемой, когда мне нужно сопоставить список индексов со списком значений с двумя условиями:

  1. Если есть повторяющийся индекс, то значения должны суммироваться
  2. Если индекса в списке нет, то значение должно быть 0

Например, ниже приведены мои 2 списка: «Список индикаций» и «Список вальсов». Итак, по индексу 0 мое значение равно 5; по индексу 1 мое значение равно 4; по индексу 2 мое значение равно 3 (2+1), по индексу 3 может иметь значение 0 (поскольку с индексом не связано никакого значения) и так далее.

Input:

'List of Inds' = [0,1,4,2,2]
'List Vals' = [5,4,3,2,1]
Output = [5,4,3,0,3]

Я боролся с этим в течение нескольких дней и не могу найти в Интернете ничего, что могло бы указать мне правильное направление. Спасибо.

Насколько велики эти списки? Важно понимать физический размер массивов, чтобы дать правильный ответ. Один из способов решить эту проблему — упорядочить ключи и значения перед вычислением с соответствующими структурами данных.

orberkov 19.01.2019 17:17

Необходимо принять максимальную длину

Jane P 19.01.2019 17:20

по какой формуле рассчитать выход

Talha Israr 19.01.2019 17:21

Также длина обоих списков равна

Talha Israr 19.01.2019 17:23

У меня нет формулы для вывода. Это то, что я пытаюсь понять.

Jane P 19.01.2019 17:23

длина обоих списков одинакова?

Talha Israr 19.01.2019 17:25

вам нужно предоставить больше информации'

sahasrara62 19.01.2019 17:33

Добро пожаловать в СО! Боюсь, я не понимаю вашего объяснения проблемы здесь. Пожалуйста, уточните ваши требования. Другие примеры ввода-вывода также могут помочь.

ggorlen 19.01.2019 17:36

вам нужно предоставить больше информации. плюс ваше условие 1 сбивает с толку. и как вы показываете в примере. как значение на выходе равно 3, а не 6 по индексу 2, а по индексу 4 значение равно 3, а не 1. полное правильное утверждение или то, как вы достигаете вывода, как вы соотносите список индекса и список значений требует правильного объяснения

sahasrara62 19.01.2019 17:41

Информации достаточно, я на полпути к коду

Talha Israr 19.01.2019 17:43

@Jane иди и проверь ответ

Talha Israr 19.01.2019 17:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
11
57
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Следующий код работает по желанию. В компьютерных науках это называется «разреженной матрицей», где данные хранятся только для указанных индексов, но «виртуальный размер» структуры данных снаружи кажется большим.

import logging

class SparseVector:
    def __init__(self, indices, values):
        self.d = {}
        for c, indx in enumerate(indices):
            logging.info(c)
            logging.info(indx)
            if indx not in self.d:
                self.d[indx] = 0
            self.d[indx] += values[c]

    def getItem(self, key):
        if key in self.d:
            return self.d[key]
        else:
            return 0

p1 = SparseVector([0,1,4,2,2], [5,4,3,2,1])
print p1.getItem(0);
print p1.getItem(1);
print p1.getItem(2);
print p1.getItem(3);
print p1.getItem(4);
print p1.getItem(5);
print p1.getItem(6);

Код ответа

def ans(list1,list2):
    dic = {}
    ans=[]
    if not(len(list1)==len(list2)):
        return "Not Possible"
    for i in range(0,len(list1)):
        ind=list1[i]
        val=list2[i]
        if not(ind in dic.keys()):
            dic[ind]=val
        else:
            dic[ind]+=val
    val=len(list1)
    for i in range(0,val):
        if not(i in dic.keys()):
            ans.append(0)
        else:
            ans.append(dic[i])
    return ans

Тестировать:

  print(ans([0,1,4,2,2], [5,4,3,2,1]))

вывод:

  [5, 4, 3, 0, 3]

Надеюсь, поможет

Комментарий, если вы не понимаете какой-либо шаг

что вы можете сделать, так это отсортировать индексы и значения в порядке возрастания, а затем суммировать их. Вот пример кода:

import numpy as np

ind = [0,1,4,2,2]
vals = [5,4,3,2,1]

points = zip(ind,vals)

sorted_points = sorted(points)

new_ind = [point[0] for point in sorted_points]
new_val = [point[1] for point in sorted_points]

output = np.zeros((len(new_ind)))

for i in range(len(new_ind)):
    output[new_ind[i]] += new_val[i]    

В этом коде значения индекса сортируются в порядке возрастания, а затем массив значений перестраивается в соответствии с отсортированным массивом индексов. Затем, используя простой цикл for, вы можете суммировать значения каждого существующего индекса и вычислить результат.

Ответ принят как подходящий
List_of_Inds = [0,1,4,2,2]
List_Vals = [5,4,3,2,1]
dic  = {}

i = 0
for key in List_of_Inds:
    if key not in dic:
        dic[key] = 0
    dic[key] = List_Vals[i]+dic[key]
    i = i+1

output = []
for key in range(0, len(dic)+1):
    if key in dic:
        output.append(dic[key])
    else:
        output.append(0)

print(dic)
print(output)

вывод:

{0: 5, 1: 4, 4: 3, 2: 3}
[5, 4, 3, 0, 3]

Это проблема группировки. Вы можете использовать collections.defaultdict для построения сопоставления словаря, увеличивая значения на каждой итерации. Затем используйте понимание списка:

indices = [0,1,4,2,2]
values = [5,4,3,2,1]

from collections import defaultdict
dd = defaultdict(int)
for idx, val in zip(indices, values):
    dd[idx] += val

res = [dd[idx] for idx in range(max(dd) + 1)]

## functional alternative:
# res = list(map(dd.get, range(max(dd) + 1)))

print(res)
# [5, 4, 3, 0, 3]

Другие вопросы по теме