This effect is because of alignment and the padding needed to achieve it. If you refer to the Python Standard Library documentation for Struct, it says in section 7.3.2.1 (I'm referring to the Python 2.7 docs):
Notes:
Padding is only automatically added between successive structure members. No padding is added at the beginning or the end of the encoded struct.
No padding is added when using non-native size and alignment, e.g. with ‘<’, ‘>’, ‘=’, and ‘!’.
To align the end of a structure to the alignment requirement of a particular type, end the format with the code for that type with a repeat count of zero. See Examples.
The standard size of an "i" is four bytes, for a "c" is 1.
In the first "ici" pack, the "c" has to be padded to 32-bit alignment (i.e. by adding three bytes) to be able to add the final "i" - so the total length is 12.
In the "iic" pack, the final "c" does not have to be padded, so the length is 9.