【问题标题】:Replace Value Nested List Comprehension替换值嵌套列表理解
【发布时间】:2020-12-10 05:41:20
【问题描述】:

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

【问题讨论】:

    标签: python for-loop list-comprehension


    【解决方案1】:

    一点可读性。嵌套列表 comp 是过多的 IMO。 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]]
    

    【讨论】:

    • 我同意这比单线要好得多。干得好!
    【解决方案2】:

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

    [[[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
    

    【讨论】:

    • 是的,单线就像完全无法维护 - 一种难以理解的理解。
    • Op 想要列表理解版本...@barny
    • 有些人想要例如杂耍刀,这不是一个好主意。 (不是我的反对票,顺便说一句)
    • @barny 我同意你的看法。我知道维护“花哨”代码的痛苦
    • 我喜欢你的方法。我同意,循环版本可能是最好的。我建议交换循环的顺序,以便输出的顺序匹配 array1
    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2018-08-16
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2016-04-03
    相关资源
    最近更新 更多