Нет ничего плохого во втором подходе.На самом деле совершенно ясно, что он делает.Вы можете использовать распаковку кортежей, чтобы она выглядела немного лучше:
for i in range(n):
first, second = map(int, raw_input().split(" "));
a.append(first)
b.append(second)
Если вы все еще хотите сделать это как одну строку, вот примерный подход, который вы могли бы использовать на другом примере:
t = ['A B', 'C D', 'E F']
a, b = zip(*(i.split() for i in t))
>>> print(a)
('A', 'C', 'E')
>>> print(b)
('B', 'D', 'F')