来自多个 2D 列表的 Python 2D 列表条件映射

Python 2D List Conditional Mapping from Multiple 2D Lists

提问人:BingQuan 提问时间:11/3/2023 最后编辑:BingQuan 更新时间:11/3/2023 访问量:51

问:

我有一个列表 A 列表,如下所示

A = [[1, 0, 0],
     [1, 1, 1],
     [0, 1, 0]]

然后我还有另外两个列表 B 和 C 列表,如下所示:

B = [['a', 'c', 's'],
     ['y', 'e', 's'],
     ['u', 'w', 'g']]

C = [['i', 'p', 'u'],
     ['k', 'l', 'n'],
     ['h', 'o', 'm']]

我正在尝试执行从 A 到 B 和 C 的映射,并具有值条件:

当“单元格”值为 1 时,引用 B 中相同位置的值,同样引用 C 时为 0。

我试图通过尝试将列表映射到列表来分解问题。但它似乎无处可去。

如何将 A 映射到 B 和 C,以便生成这样的列表列表?

[['a', 'p', 'u'],   # 'a' from B; 'p' from C; 'u' from C
 ['y', 'e', 's'],   # 'y' from B; 'e' from B; 's' from B
 ['h', 'w', 'm']]   # 'h' from C; 'w' from B; 'm' from C
Python 列表 字典 多维数组 坐标

评论


答:

3赞 blhsing 11/3/2023 #1

您可以通过先压缩 3 个列表来循环访问它们:

[[a and b or c for a, b, c in zip(*t)] for t in zip(A, B, C)]

演示:https://ideone.com/f8XRdk

1赞 le2dy 11/3/2023 #2
def exchange(value_map, zipped_list):
    temp = []
    for i, row in enumerate(value_map):
        temp_inner = []
        for j, obj in enumerate(row):
            temp_inner.append(zipped_list[obj][i][j])
        temp.append(temp_inner)
    return temp


print(exchange(A, [C, B]))

我把它作为功能。

0赞 BingQuan 11/3/2023 #3

编辑:我找到了一种方法:-np.ndenumerate

import numpy as np

for (x,y), e in np.ndenumerate(A):
    if e == 1: # or any or more conditions
        A[x][y] = B[x][y]
    else:
        A[x][y] = C[x][y]

上面公认的答案最适合两个条件 (1/0)。