However I do it, what the computer gives me is numerical values I then "translate" into what they're actually supposed to be.
I rather have this sort of relationship with my programs as well.
Anyway, Python is surely an interesting and popular language. There is, also, a pitch class library available for it
here that might be worth a gander (though I remain skeptical as to the utility of such a library in general). Let us know how you get on exploring it.
I feel somewhat compelled to speak of my own personal choice of programming language for these sort of tasks,
Haskell. As I said before, it's good for doing stuff with lists (it does a lot of other very heavy duty stuff as well, but that's not for here)*.
A couple of examples. It has a 'map' command that transfers a function on, say numbers, to a function on lists of number, by applying it to each element.
So say I defined my transpose function as
transpose a n = (a+n) `mod` 12
Then if I wanted to transpose or invert the pitch-class set [0,4,7] by a 8 semitones I'd write
map (transpose 8) [0,4,7]
(output [8,0,3])
If I wanted to write a function that would, given a pcset, return all the present intervals, I'd do it as follows
intervals s = [ (x-y) `mod` 12 | x<-s, y <- s]
(I find these (mathematical) set-theoretic styles of definitions of functions to be really pleasant to write).
Then if I typed
intervals [1,4,6]
I'd get the output [0,9,7,3,0,10,5,2,0]. If I wanted to remove the duplicate entries there's a function called 'nub' that does that.
There are
plenty of other list* operations that I occasionally find myself lusting after when I'm programming in other languages.
*I've heard it said that python is pretty hand when it comes to list-manipulation as well, but I'm not familiar enough with it to comment.