Самый быстрый способ для больших массивов - использовать логическое маскирование .
Сначала добавим начальные списки в массивы NumPy:
countries = ['Germany','USA','France','Germany','USA','USA']
values = [250,220,230,180,180,220]
countries = np.array(countries)
values = np.array(values)
А теперь для каждой уникальной страны заполняем значения результирующего дикта cv
сразу без добавления:
cv = {country: values[countries == country]
for country in set(countries)}
print(cv)
даст:
{'France': array([230]),
'USA': array([220, 180, 220]),
'Germany': array([250, 180])}
Тайминги:
Я увеличил размеры массивов для более наглядного примера:
n = 500
countries = np.array(['Germany','USA','France','Germany','USA','USA'] * n)
values = np.array([250,220,230,180,180,220] * n)
# My version
%%timeit
cv = {country: values[countries == country]
for country in set(countries)}
# 987 µs ± 5.46 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# MathiasRa's version
%%timeit
cv = {'Germany':[],'USA':[],'France':[]}
for i in range(len(countries)):
cv[countries[i]].append(values[i])
# 1.67 ms ± 9.94 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# jpp's version
%%timeit
d = defaultdict(list)
for c, v in zip(countries, values):
d[c].append(v)
res = {k: np.array(v) for k, v in d.items()}
# 1.5 ms ± 2.37 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# Johann Bzh's version
%%timeit
d={}
for c, v in zip(countries, values):
tmp_vec = np.array([v])
try:
d[c] = np.hstack((d[c],tmp_vec))
except KeyError: #first occurence of this country
d[c] = tmp_vec
# 13.3 ms ± 125 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)