Хотя вы упоминаете, что не хотите использовать numpy в этом случае, возможно, стоит посмотреть на разницу в скорости.
Лучшим решением, отличным от numpy, является генератор, использующий izip, который незначительно превосходит zip.
In [31]: %timeit sum(x*y for x,y in zip(weights,items))
10000 loops, best of 3: 158 us per loop
In [32]: %timeit sum(x*y for x,y in izip(weights,items))
10000 loops, best of 3: 125 us per loop
Однако, когда мы используем массивы numpy, мы получаем:
In [33]: %timeit (np_weights,np_items).sum()
100000 loops, best of 3: 9.08 us per loop
Полное решение в 14 раз быстрее. Если это действительно узкое место в вашем коде, тогда numpy - это то, что нужно.