Python 替换值嵌套列表理解
我正在努力找出如何将嵌套列表理解与替换混合在一起 下面是我试图转换的嵌套for循环的一个示例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
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