替换值嵌套列表理解

Replace Value Nested List Comprehension

我正在努力弄清楚如何将嵌套列表理解与替换混合 这是我尝试转换的嵌套 for 循环的示例

array1 = [[1,2,3],[4,5,6],[7,8,9]]
array2 = [['a','b','c'],[7,4,1]]

for i in array1: 
    value=i[0] 
    for val2 in array2[1]: 
        if value==val2: 
            #convert i to array2[0][array2[1].index(val2)]

我已经试过了,但它只会将所有内容转换为 ['a'、'b'、'c']

In [34]: [[x if x == y else array2[0] for y in array2[1]] for x in array1]

Out[34]:
[[['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']],
 [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']],
 [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]]

我期待的结果是

In[35]:array1
Out[35]: 
[['c',2,3],['b',5,6],['a',8,9]]

如果列表理解不是解决此问题的最佳方法,我也将不胜感激。我可以这样做,但我认为这不是最有效的方法。

for ii in range(len(array1))
    value = array1[ii]
    ...
            array1[ii] = array2[0][array2[1].index(val2)]

一点可读性。嵌套列表 comp 过多 IMO。 array2 对于它正在做的事情来说确实是错误的数据结构,所以我的第一个倾向是把它变成 dictionary/mapping,因为这就是你在这里使用它的方式。

array1 = [[1,2,3],[4,5,6],[7,8,9]]
array2 = [['a','b','c'],[7,4,1]]

conversion = {}
letter_list, num_list = array2
for num, letter in zip(num_list, letter_list):
    conversion[num] = letter

output = [
    [conversion.get(num, num) for num in num_list] for num_list in array1 
]

# [['c', 2, 3], ['b', 5, 6], ['a', 8, 9]]

这应该在一行中得到你想要的:

[[[x]+z[1:] for z in array1 if z[0] == y][0] for x, y in zip(*array2)]
[['a', 8, 9], ['b', 5, 6], ['c', 2, 3]]

for 循环版本:

output = []
for i, x in enumerate(array2[0]):
    for y in array1:
        if y[0] == array2[1][i]:
            output.append([x]+y[1:])
output