In one line:
values, weights = zip(*sorted(zip(values, weights), key=lambda t: t[0]/t[1]))
To explain: first, write down the lists to put them together.
pairs = zip(values, weights)
Then sort by partial value by weight.
sorted_pairs = sorted(pairs, key=lambda t: t[0]/t[1])
Finally, unzip them back into separate lists.
values, weights = zip(*sorted_pairs)
An alternative is to construct tuples explicitly containing the relation as the first element.
ratios, values, weights = zip(*sorted((v/w, v, w) for v, w in zip(values, weights)))
The first seems to be slightly faster in some quick tests. If you are looking for the best algorithm, you may have to unwrap things and the solution will not be so concise.
And to answer a comment from @TomWyllie, if you already have a list of odds, you can use:
ratios, values, weights = zip(*sorted(zip(ratios, values, weights)))
Note that these last two solutions differ from the original solution in the case when two pairs are equally related. These solutions will be sorted a second time by value, while the first solution will contain items in the same order as the original list.