【问题标题】:Replace all values in list of lists according to positions in another list根据另一个列表中的位置替换列表列表中的所有值
【发布时间】:2018-08-28 13:27:44
【问题描述】:

假设我们有一个列表和一个列表列表。我想替换后者的每个子列表中的所有值,以便将值 i 替换为前者的 i-th 位置中的值。例如:

l = [4,2,1,0,3]
l_of_l = [[0,3],[4,1,2,3],[2,4]]

desired_output = [[4,0],[3,2,1,0],[1,3]]

所有0 都替换为l[0],等于4。所有1 都被l[1] 替换,等于2。以此类推。

所有数字在l 中只出现一次,最大和最小之间的所有数字都在那里。即,如果最小值为0,最大值为6,则列表将是list(range(7)) 的洗牌版本。此外,l_of_l 包含的列表中存在的所有数字都存在于l 中(即,如果l 中的最大值为6,则在任何@ 列表中都不会有任何大于6 的数字987654339@)。

我已经这样做了:

for this_l in l_of_l:
    for i in range(len(this_l)):
        this_l[i] = l[this_l[i]]

但我不太喜欢循环。有没有更 Pythonic 的方式来做到这一点?

【问题讨论】:

  • 你需要一个完全递归的解决方案还是结构总是一个二维列表?
  • @MadPhysicist 该结构将始终与问题中的结构相同。

标签: python list


【解决方案1】:

您可以使用列表推导:

l = [4,2,1,0,3]
l_of_l = [[0,3],[4,1,2,3],[2,4]]
result = [[l[b] for b in i] for i in l_of_l]

输出:

[[4, 0], [3, 2, 1, 0], [1, 3]]

或者,如果您希望完全避免显式循环,您可以使用map

result = list(map(lambda x:list(map(lambda c:l[c], x)), l_of_l))

输出:

[[4, 0], [3, 2, 1, 0], [1, 3]]

虽然后者不如列表理解那么干净。

【讨论】:

  • 请重命名l。在可能的字体中,这看起来像I。最好不要鼓励这种约定:)
【解决方案2】:

您可以通过使用 maplist.__getitem__ 来避免显式的内部 for 循环:

L = [4,2,1,0,3]
LoL = [[0,3],[4,1,2,3],[2,4]]

res = [list(map(L.__getitem__, i)) for i in LoL]

[[4, 0], [3, 2, 1, 0], [1, 3]]

【讨论】:

    【解决方案3】:

    列表推导始终是一种选择,尽管它不会像您的解决方案那样就地:

    result = [[l[x] for x in row] for row in l_of_l]
    

    我知道您说过您不想要一个完全递归的解决方案,但这里有一个适用于包含整数和其他可迭代对象的任意嵌套可迭代对象:

    from functools import partial
    
    def lookup(table, values):
        try:
            return list(map(partial(lookup, table), values))
        except TypeError:
            return table[values]
    

    IDEOne 链接:https://ideone.com/atwfnO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      • 2020-03-20
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多