make two tables having same orders in both column and row names

Jon Clements joncle at googlemail.com
Thu Nov 19 23:00:45 CET 2009


On Nov 18, 8:57 pm, Ping-Hsun Hsieh <hsi... at ohsu.edu> wrote:
> Hi,
>
> I would like to compare values in two table with same column and row names, but with different orders in column and row names.
> For example, table_A in a file looks like the follows:
> AA100   AA109   AA101   AA103   AA102
> BB1     2       9       2.3     1       28
> BB3     12      9       2.3     1       28
> BB9     0.5     2       2.3     1       28
> BB2     2       9       21      1       20
>
> Table_B in the other file looks like the follows:
> AA101   AA109   AA100   AA103   AA102
> BB1     2       9       2.3     2       28
> BB2     2       9       2.3     1       28
> BB9     2       9       2.3     1       28
> BB3     2       2       2       1       28
>
> Can anyone give an efficient way to make the two tables having same orders in column and row names so I can easily and correctly compare the values in positions?
>
> Thanks,
> PingHsun

Use a dictionary with a tuple of the row 'name' and column 'name' as
the key.

The following was put together in a hurry, so take with a pinch of
salt (and brandy or something :))...

t1data = """AA100   AA109   AA101   AA103   AA102
BB1     2       9       2.3     1       28
BB3     12      9       2.3     1       28
BB9     0.5     2       2.3     1       28
BB2     2       9       21      1       20"""


def create_table(what):
    from itertools import imap, islice, izip, cycle, repeat
    table = filter(None, imap(str.split, what.split('\n')))
    table_dict = {}
    for cols in islice(table, 1, None):
        for row_name, col_name, col in izip(cycle(table[0]), repeat
(cols[0]), islice(cols, 1, None)):
            table_dict[(row_name, col_name)] = col
    return table_dict


print create_table(t1data)


hth
Jon.





More information about the Python-list mailing list