按列而不是行键控

Keying by columns, not rows

我代表 并假设我有一个字典,键是行索引,我如何将它转换(就地看起来很棘手)到键将是列索引的字典?


这是我的尝试:

by_row = {}
N = 3
M = 5
for i in range(1, N):
    row = []
    for j in range(1, M):
        row.append(j)
    by_row[i] = row
print by_row

by_column = {}
for i in range(1, M):
    col = []
    for j in range(1, N):
        col.append(by_row[j][i - 1])
    by_column[i] = col
print by_column

但我正在寻找更优雅和 Pythonic 的东西。这里 my_dict_1 以行索引作为键,而 my_dict_2 以列索引作为键。输出:

{1: [1, 2, 3, 4], 2: [1, 2, 3, 4]}
{1: [1, 1], 2: [2, 2], 3: [3, 3], 4: [4, 4]}

使用 enumerate() function 为列编号,并按排序顺序遍历键:

by_column = {}
for rownum, row in sorted(by_row.iteritems()):
    for colnum, value in enumerate(row, 1):
        by_column.setdefault(colnum, []).append(value)

这假设您的字典中存在所有行号,并且所有行的长度都相等。

演示:

>>> N, M = 2, 4  # 2 rows, each 4 columns
>>> by_row = {r: range(1, M + 1) for r in range(1, N + 1)}
>>> by_row
{1: [1, 2, 3, 4], 2: [1, 2, 3, 4]}
>>> by_column = {}
>>> for rownum, row in sorted(by_row.iteritems()):
...     for colnum, value in enumerate(row, 1):
...         by_column.setdefault(colnum, []).append(value)
...
>>> by_column
{1: [1, 1], 2: [2, 2], 3: [3, 3], 4: [4, 4]}

这里有一个超级 pythonic 的方式给你:

>>> by_row = {1: [1, 2, 3, 4], 2: [1, 2, 3, 4]}
>>> by_column = {n+1:[row[n] for row in by_row.values()] for n in range(len(by_row[1]))}
>>> by_column
{1: [1, 1], 2: [2, 2], 3: [3, 3], 4: [4, 4]}