Python中的多维列表控件

2024-06-16 11:25:38 发布

您现在位置:Python中文网/ 问答频道 /正文

如果[i][0]在列表中是相同的值,我将尝试只保留[i][0]的一个值,然后将[i][1]的每个值相加

下面是一个示例代码

[['R21', 120], ['R21', 120], ['R23', 200]]

这是我期待的结果

[['R21',240],['R23',200]]

我创建了每个值的单个列表,找到重复的值,添加这些值的索引。 有没有一种方法可以在不创建单个列表的情况下实现它

提前谢谢你的帮助


Tags: 方法代码示例列表情况r23r21
3条回答

您可以创建临时字典来保存您的值,然后再转换回列表:

lst = [["R21", 120], ["R21", 120], ["R23", 200]]

out = {}
for k, v in lst:
    out.setdefault(k, 0)
    out[k] += v

out = [[k, v] for k, v in out.items()]
print(out)

印刷品:

[['R21', 240], ['R23', 200]]

要做到这一点,一个很好的方法是浏览一下您的列表,如下所示:

x = [['R21', 120], ['R21', 120], ['R23', 200]]
result = {}
for pair in x:
    key, value = pair
    if key in result:
        result[key] += value
    else:
        result[key] = value
# result is {'R21': 240, 'R23': 200}

现在,如果你坚持要一份清单,我们可以写:

result = [list(item) for item in result.items()]

但是,result.items()将为您提供一个tuples列表,因此无需转换为此列表,除非您打算展开或修改它们。这第二步将添加初始列表的第二次遍历

在时间和空间方面,这可能不是最佳的解决方案,但对于任何输入都是可扩展的,并且任何人都可以清楚地理解;我不想使用python列表理解来让它更清楚:

numbers = [['R21', 120], ['R21', 120], ['R23', 200]]

def merge(nums):
    new = []
    checked = []

    for i in range(len(nums)):
        if nums[i][0] in checked:
            continue
        target = nums[i]
        sm = target[1]
        for n in nums[i+1:]:
            if n[0] == target[0]:
                sm += n[1]
        new.append([target[0], sum])
        checked.append(target[0])

    return new

print(merge(numbers))

输出:

[['R21', 240], ['R23', 200]]

相关问题 更多 >