Python3: 150 bytes f=lambda l: ''.join('+-'[a<0]+str(a)[a<0:5*((abs(a)!=1)|(1>i))]+'x^'[:i]+str(i)[:i-1] for i,a in zip(range(len(l)-1,-1,-1),l) if a).lstrip('+') or '0' You can [*try it online*](https://tio.run/##hY/BboQgEIbv@xQ0PcAU2IDEbDTdvojRhG3XLQ1F43qgTd/dgibLag8lBGaY7/@Z6b/G984p/jrf09Qerf48vWlkS4Tx/qMzjmDKcaWfRU2v40A0xLjMnwjRp2tIH44Sfoh8MQA1xb7BVWkW1EAIuaxR2w3IMI2MQ9@mJ4N2lzOxZ0cscMnmDcwCMi3SsLdBGyhMMaAgxAJP/WDcSFpSCSZqgF3K11n0UjOC0ivPmWQHxosVK0XwYjL@/ccR3a/HWyR2mz7@p2I/eWJvFPdNRlXuE3vX5NYx942iUXDwvNhOIJYB1opQChouE1woybI4rGQLnuBQih9k4cxC3VM5/QI)