从多个嵌套的列表中更新一个项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从多个嵌套的列表中更新一个项目相关的知识,希望对你有一定的参考价值。

我有一个由多个列表组成的列表,我需要能够更新所有列表中出现的最大值,使其变为0。例如,对于这个列表,我想更新最大值,即6为0。那么,我怎样才能同时更新这两个位置呢?

g.graph = [[0, 2, 0, 6, 0],
           [2, 0, 3, 0, 5],
           [0, 3, 0, 0, 0],
           [6, 0, 0, 0, 0],
           [0, 5, 0, 0, 0]]
答案

这可以满足你的要求,但这取决于你所说的 "删除 "是什么意思。

graph = [[0, 2, 0, 6, 0],
         [2, 0, 3, 0, 5],
         [0, 3, 0, 0, 0],
         [6, 0, 0, 0, 0],
         [0, 5, 0, 0, 0]]


def del_max(g):
    m = max(max(row) for row in g)
    return [[x if x != m else None for x in xs] for xs in g]


print(del_max(graph))

你不可能事先知道最大值是什么 所以函数会找到所有行的最大值 然后返回输入数组,其中只有不属于最大值的值。

另一答案

首先你得从这些列表中知道最大值是多少,然后你就可以删除所有出现的值。

这段代码可以解决你的问题。

graph = [[0, 2, 0, 6, 0],
        [2, 0, 3, 0, 5],
        [0, 3, 0, 0, 0],
        [6, 0, 0, 0, 0],
        [0, 5, 0, 0, 0]]

max_val = 0

for lst in graph:
    for item in lst:
        if item > max_val:
            max_val = item

for lst in graph:
    for item in lst:
        if item == max_val:
            lst.remove(item)

print(str(graph))
另一答案

你可以这样做

def update(list_, value):
    try:
        index = list_.index(value)
        list_.[index] = 0
    except ValueError:
        pass

value_to_update = max([i for l in g.graph for i in l])    # Flattening the g.graph list to find the maximum value
list(map(lambda x: update(x, value_to_update), g.graph))    # Calling list() because it needs to run over the map, which is lazy

这段代码实际上更新了原来的值 g.graph 列表,而不是创建一个新的列表。

另一答案

另一种方法,如果你有兴趣使用 itertools.chain 扁平化列表并获得最大值

from itertools import chain
[[0 if j == max(chain(*graph)) else j for j in i] for i in graph]

输出。

[[0, 2, 0, 0, 0],
 [2, 0, 3, 0, 5],
 [0, 3, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 5, 0, 0, 0]]
另一答案
Use remove method.
    list.remove(x)

其中list是你的列表名称,x是需要删除的内容。

以上是关于从多个嵌套的列表中更新一个项目的主要内容,如果未能解决你的问题,请参考以下文章

无法从 ViewPager 中的另一个片段刷新/更新片段中的列表视图

从活动更新视图页面中片段中的列表视图

从android eclipse中的片段刷新或更新listadapter

更新片段中的 RecyclerView

从广播接收器更新片段中的列表视图

替换从 VAST 代码返回的多个 HLS VOD 片段