The BORA-hansgrohe star played his cards 300 metres out to finish ahead of Elia Viviani (Deceuninck-Quick Step) and Trek-Segafredo's John Degenkolb.
Sagan now leads Kasper Asgreen (Deceuninck-Quick Step) by 10 seconds with Australian Rohan Dennis (Bahrain-Merida) third at 11 seconds.
"I'm happy with this stage win, my 17th at the Tour de Suisse, and the leader's yellow jersey," Sagan said. " I'd like to thank the whole team for their brilliant work, they controlled the race and placed me in a perfect spot for the victory.
"It was a very fast finale and quite hectic because everybody wanted to be in the front. When we crossed the finish line for the first time, it was clear to me that in order to have a chance at winning, I had to be in the first positions of the group before the last left turn.
"That's what we did and I was able to attack in the final stretch to get the victory."
The breakaway containing Bert-Jan Lindemann (Jumbo-Visma), Willem Jakobus Smit (Katusha-Alpecin), Ryan Anderson (Rally UHC) and Simon Pellaud from the Swiss national team built a lead of three minutes 40 seconds during the 154km exploit but it ended with six kilometres to race on the 163.2km stage from Flamatt to Murten.
The fourth stage heads 163.9km south from Murten to Arlesheim.