Я новичок в Python и работаю над проблемой, когда мне нужно сопоставить список индексов со списком значений с двумя условиями:
Например, ниже приведены мои 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]
Я боролся с этим в течение нескольких дней и не могу найти в Интернете ничего, что могло бы указать мне правильное направление. Спасибо.
Необходимо принять максимальную длину
по какой формуле рассчитать выход
Также длина обоих списков равна
У меня нет формулы для вывода. Это то, что я пытаюсь понять.
длина обоих списков одинакова?
вам нужно предоставить больше информации'
Добро пожаловать в СО! Боюсь, я не понимаю вашего объяснения проблемы здесь. Пожалуйста, уточните ваши требования. Другие примеры ввода-вывода также могут помочь.
вам нужно предоставить больше информации. плюс ваше условие 1 сбивает с толку. и как вы показываете в примере. как значение на выходе равно 3, а не 6 по индексу 2, а по индексу 4 значение равно 3, а не 1. полное правильное утверждение или то, как вы достигаете вывода, как вы соотносите список индекса и список значений требует правильного объяснения
Информации достаточно, я на полпути к коду
@Jane иди и проверь ответ






Следующий код работает по желанию. В компьютерных науках это называется «разреженной матрицей», где данные хранятся только для указанных индексов, но «виртуальный размер» структуры данных снаружи кажется большим.
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]
Насколько велики эти списки? Важно понимать физический размер массивов, чтобы дать правильный ответ. Один из способов решить эту проблему — упорядочить ключи и значения перед вычислением с соответствующими структурами данных.