You could try this:
output_arr = []
for row in reader:
# Get the mapping for A ranges
idx_map = row[0].replace("A","").split(",")
for row_map in idx_map:
# For each pair or #-#'s creating the min and max idxs
mapping = [int(v) for v in row_map.split('-')]
min_map = min(mapping)
max_map = max(mapping)
for idx in range(min_map,max_map+1):
# For each value in range min_map to max_map, set values of row.
output_arr.append(["A%i"%(idx),row[1],row[2]])
>>> import pprint
>>> pprint.pprint(output_arr)
[['A1', 'A,B', 'C'],
['A2', 'A,B', 'C'],
['A3', 'A,B', 'C'],
['A4', 'A,B', 'C'],
['A5', 'A,B', 'C'],
['A6', 'X', 'Y'],
['A7', 'X', 'Y'],
['A8', 'Z', 'D']]
This will handle anomalies like: "A3-A1"