Won't work that way.
Actually, I sort of lie. It kind of will work that way (I had trouble with the generators you wrote):
>>> table = [[raw_input('Input data: ') for i in range(1, nc+1)] for i in range(1, nr+1)]
Input data: 1
Input data: 2
Input data: 3
Input data: 4
Input data: 5
Input data: 6
Input data: 7
Input data: 8
Input data: 9
>>> table
[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']]
But that's what you asked for in the beginning--you seem to want the end user to be able to enter the column and row headers, and then fill the data.
If we:
table = [[raw_input('Input data: {},{} '.format(a,b)) for a in range(0, nc)] for b in range(0, nr)]
then we can get:
Input data: 0,0 None
Input data: 1,0 1
Input data: 2,0 2
Input data: 0,1 a
Input data: 1,1 Ted
Input data: 2,1 Fred
Input data: 0,2 b
Input data: 1,2 3.214
Input data: 2,2 Copy
>>> table
[['None', '1', '2'], ['a', 'Ted', 'Fred'], ['b', '3.214', 'Copy']]
Now, the messed up part of your scheme is that to find a coordinate in your "grid" you have to read every column heading and get back it's position, then read every row heading to get back it's position. then you can :
value = grid[r][c]
Now, to do your reverse is even harder--you have to read EVERY CELL to get back your row and column headings.
Oh, and we've done no error checking to make sure you don't enter 2 rows or headings the same, which would completely blow your scheme. You'll need that.
Also it's a lot of work filling out that grid.
The rest of this is me noodling through it w/out generators, and making some educational mistakes.
If you want to use lists of lists:
row = [None for i in range(0,nc+1)]
grid = [row for i in range(0,nr+1)]
This then gives you a list of lists that are filled with None.
>>> grid
[[None, None, None, None], [None, None, None, None], [None, None, None, None], [None, None, None, None]]
Ok, so put in the column headers:
>>> for ch in range (1,nc+1):
... grid[0][ch] = raw_input("Header, Column {}".format(ch))
...
Header, Column 111
Header, Column 222
Header, Column 333
>>> grid
[[None, '11', '22', '33'], [None, '11', '22', '33'], [None, '11', '22', '33'], [None, '11', '22', '33']]
Huh, why didn't that work?
>>> grid[0][3]="steve"
>>> grid
[[None, '11', '22', 'steve'], [None, '11', '22', 'steve'], [None, '11', '22', 'steve'], [None, '11', '22', 'steve']]
Oh, yeah.
Bugger.
import copy
row = [None for i in range(0,nc+1)]
grid = [copy.deepcopy(row) for i in range(0,nr+1)]
>>> for ch in range (1,nc+1):
... grid[0][ch] = raw_input("Header, Column {}: ".format(ch))
...
Header, Column 1: 11
Header, Column 2: 22
Header, Column 3: 33
>>> grid
[[None, '11', '22', '33'], [None, 5, None, None], [None, None, None, None], [None, None, None, None]]
(ignore the 5, that was me testing)
And then the rows:
>>> for rh in range(1,nr+1):
... grid[rh][0] = raw_input("Row Header: {} ".format(rh))
...
Row Header: 1 11
Row Header: 2 22
Row Header: 3 33
>>> grid
[[None, '11', '22', '33'], ['11', 5, None, None], ['22', None, None, None], ['33', None, None, None]]
So now you fill it with data (left as an exercise because it's blood obvious).