Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换值嵌套列表理解_Python_For Loop_List Comprehension - Fatal编程技术网

Python 替换值嵌套列表理解

Python 替换值嵌套列表理解,python,for-loop,list-comprehension,Python,For Loop,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].i

我正在努力找出如何将嵌套列表理解与替换混合在一起 下面是我试图转换的嵌套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在我看来太多了。
array2
对于它所做的事情来说确实是一个错误的数据结构,所以我的第一个倾向是将它作为一个字典/映射,因为这就是您在这里使用它的方式

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)]
对于循环版本:

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

我同意这比一行要好得多。做得好!是的,一行是完全不可维护的-一个不可理解的理解。Op想要列表理解版…@Barny有些人想要玩杂耍刀,这不是一个好主意。(顺便说一句,这不是我的反对票)@barny我同意你的看法。我知道维持“花哨”代码的痛苦我喜欢你的方法。我同意,循环版本可能是最好的。我建议交换循环的顺序,以便输出顺序与数组1匹配
output = []
for i, x in enumerate(array2[0]):
    for y in array1:
        if y[0] == array2[1][i]:
            output.append([x]+y[1:])
output