Assuming you understand lines 1-6…
Line 7:
sums[ix]=sums.get(ix, 0)+num
sums.get(ix, 0) is the same as sums[ix], except that if ix not in sums it returns 0 instead. So, this is just like sums[ix] += num, except that it first sets the value to 0 if this is the first time you've seen ix.
So, it should be clear that by the end of this loop, sums[ix] is going to have the sum of all values in column ix.
This is a silly way to do this. As mgilson points out, you could just use defaultdict so you don't need that extra logic. Or, even more simply, you could just use a list instead of a dict, because this (indexing by sequential small numbers) is exactly what lists are for…
Line 8:
for key in sorted(sums):
First, you can iterate over any dict as if it were a list or other iterable, and it has the same effect as iterating over sums.keys(). So, if sums looks like { 0: 4, 1: 6, 2: 3 }, you're going to iterate over 0, 1, 2.
Except that dicts don't have any inherent order. You may get 0, 1, 2, or you may get 1, 0, 2, or any other order.
So, sorted(sums) just returns a copy of that list of keys in sorted order, guaranteeing that you'll get 0, 1, 2 in that order.
Again, this is silly, because if you just used a list in the first place, you'd get things in order.
Line 9:
print(key, '=', sums[key])
This one should be obvious. If key iterates over 0, 1, 2, then this is going to print 0 = 4, 1 = 6, 2 = 3.
So, in other words, it's printing out each column number, together with the sum of all values in that column.
for(ix,num) in enumerate(nums):- you don't need( )aroundix,num