Here's a solution that first builds a set of all columns and then uses that as template for every row. The upside of this solution is that you only need to include the data sets you want in every dict. To display that the input in this example introduces a row "300" with one intersecting column and a new one.
The OrderedDict is a small helper for ordering columns. You could also loop if you don't like the dependency.
from collections import OrderedDict
my_dict = {
100: {0.5: 1, 0.6: 0 },
200: {0.5: 1, 0.6: 1 },
300: {0.5: 5, 0.7: 6}}
# header columns
cols = set()
for d in my_dict.values():
cols.update(d.keys())
cols = list(sorted(cols))
print "\t", "\t".join([str(c) for c in cols])
# data rows
for row, d_cols in sorted(my_dict.items()):
e_cols = OrderedDict().fromkeys(cols)
e_cols.update(d_cols)
print row, "\t", "\t".join([str(v) for v in e_cols.values()])
Result:
python test.py
0.5 0.6 0.7
100 1 0 None
200 1 1 None
300 5 None 6