替换值嵌套列表理解
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
我正在努力弄清楚如何将嵌套列表理解与替换混合 这是我尝试转换的嵌套 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