【问题标题】:How do I add specific elements of a list of lists in Python?如何在 Python 中添加列表列表的特定元素?
【发布时间】:2018-10-16 17:20:33
【问题描述】:

因此,如果第一个值和第二个值相等,我想在列表列表中添加元素的第三个值。如果没有,我希望将不相等的添加到我的总和列表中。

first=[[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
second=[[1,1,3],[4,2,4],[2,3,2]]
sum=[]

for i in ((first)):
    for j in ((second)):
        if i[0]==j[0] and i[1]==j[1]:
            sum.append([i[0],j[1],i[2]+j[2]])
        

print(sum)

所以这给了我[[1, 1, 8], [2, 3, 9]],但我也希望[3,5,2],[4,4,6],[4,2,4] 在我的sum 列表中。我如何在 python 中做到这一点?

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    一种解决方案是使用标准库中的collections.defaultdict

    这个想法是将您的字典键设置为前 2 个元素的元组,并以第三个元素递增。然后通过字典推导聚合键和值。

    first = [[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
    second = [[1,1,3],[4,2,4],[2,3,2]]
    
    from collections import defaultdict
    from itertools import chain
    
    d = defaultdict(int)
    
    for i, j, k in chain(first, second):
        d[(i, j)] += k
    
    res = [[*k, v] for k, v in d.items()]
    
    print(res)
    
    [[1, 1, 8], [2, 3, 9], [3, 5, 2], [4, 4, 6], [4, 2, 4]]
    

    这是不使用任何库的等效解决方案,使用dict.setdefault

    d = {}
    for i, j, k in first+second:
        d.setdefault((i, j), 0)
        d[(i, j)] += k
    
    res = [[*k, v] for k, v in d.items()]
    

    【讨论】:

    • 因为这是 Python 3,你可以使用[*k, v]。但也许这在这个级别上是不合适的。
    • 嗯,这很好用!但我不想使用任何库,因为我们还没有在课堂上看到这些库。不过还是谢谢!
    • chain.from_iterable((first, second)) 可以是chain(first, second)first + second
    • @AlexHall,感谢您的建议,我已更新。在此处使用chain 以避免构建新列表。
    【解决方案2】:

    我尝试在没有字典或库的情况下做到这一点:

    first = [[1,1,5],[2,3,7],[3,5,2],[4,4,6]]
    second = [[1,1,3],[4,2,4],[2,3,2]]
    checked = []
    sum = []
    
    for n_i, i in enumerate(first):
        for n_j, j in enumerate(second):
            if i[0]==j[0] and i[1]==j[1]:
                sum.append([i[0],j[1],i[2]+j[2]])
                checked.append([n_i,n_j]) # Save the used index
    
    # Delete used index
    [first.pop(i[0]) and second.pop(i[1]) for i in reversed(checked)]
    
    # Append non-used index
    [sum.append(first.pop(0)) for x in range(0,len(first))]
    [sum.append(second.pop(0)) for x in range(0,len(second))]
    
    print(sum)
    

    返回:

    [[1, 1, 8], [2, 3, 9], [3, 5, 2], [4, 4, 6], [4, 2, 4]]
    

    【讨论】:

    • 这是我首先要寻找的,因为只需将 i[2]+j[2] 更改为 i[2]-j 就可以更轻松地进行任何数学运算,例如减法[2]
    猜你喜欢
    • 2019-01-29
    • 2020-03-13
    • 1970-01-01
    • 2023-02-24
    • 2021-08-15
    • 2017-10-03
    • 1970-01-01
    • 2021-12-28
    • 2016-11-22
    相关资源
    最近更新 更多