So @aesthete's answer is right. I just want to add explanation.
>>> ls3 = ['-'.join(x) for x in zip(ls1, ls2)]
['1-4', '2-3', '3-2', '4-1']
the [someaction(x) for x in somelist] will return a list where each element is someaction() performed on the corresponding x in somelist. This is called a list comprehension.
In this case somelist is zip(ls1,ls2) which creates [(ls1[0], ls2[0]), (ls1[1], ls2[1]), ...]
So zip(ls1,ls2) returns [('1', '4'), ('2', '3'), ('3', '2'), ('4', '1')]
The someaction() is '-'.join() What that does is it takes a iterable sequence of strings and joins them together with the string '-' in between. So you could have done ' to '.join(x) to get ['1 to 4', '2 to 3', ...]