代码之家  ›  专栏  ›  技术社区  ›  Zeynel

消除重复项并对列表中的相应项求和

  •  1
  • Zeynel  · 技术社区  · 15 年前

    给出这两个列表

    L2 = [A,B,C,D,A,B]
    L3 = [3,2,1,2,2,1]
    

    我想得到

    L2_WANTED = [A,B,C,D]
    L3_WANTED = [5,3,1,2]
    

    列表总是按顺序排列,大小和元素与键值对(如A:3、B:2等)对应。

    其目的是消除二级语言中的重复项,并对三级语言中的对应项进行求和,得到一个匹配对的新列表。这是为了在项目添加到列表时保持项目的运行列表。

    我试图用 index 但它开始变得丑陋起来。我检查过了 itertools 但是找不到任何相关的东西;我看着 starmap() 但不能让它工作。也许这也可以通过列表理解来完成。对于如何实现这个最简单的方法,我会很感激任何线索或指导。谢谢您。

    ED

    @ SimonC:

    >>> l2_sum = {}
    >>> for i in range(0, len(L2)):
            key = L2[i]
            num = L3[i]
            l2_sum[key] = l2_sum.get(key, 0) + num
    
    
    >>> l2_sum
    {'A': 5, 'C': 1, 'B': 3, 'D': 2}
    >>>
    

    这是如何消除重复并添加数字的?你能给点线索吗?谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   pyfunc    15 年前

    我相信那里会有更优雅的回答,并且会在回答中出现。

    但对于一些简单的答案:

    L2 = ['A','B','C','D','A','B']
    L3 = [3,2,1,2,2,1]
    
    L4 = zip(L2, L3)
    
    L5 = []
    L6 = []
    def freduce(l):
        for x, y in l:
            print x , y
            if x in L5:
                k = L5.index(x)
                L6[k] += y
            else:
                L5.append(x)
                L6.append(y)
    
    freduce(L4)  
    print L5
    print L6
    

    输出:

    ['A', 'B', 'C', 'D']
    [5, 3, 1, 2]
    

    [为理解第二个实现而编辑的答案]

    >>> L3 = [3,2,1,2,2,1]
    >>> L2 = ['A','B','C','D','A','B']
    >>> range(0, len(L2))
    [0, 1, 2, 3, 4, 5]
    >>> 
    

    因此,对于范围(0,len(l2))中的i:我变成了一个索引

    使用此索引,可以通过执行以下操作从L3和L2提取信息:

    key = L2[i]
    num = L3[i]
    

    然后你将信息添加到听写中

    l2_sum[key] = l2_sum.get(key, 0) + num
    

    此处,如果键不存在,则l2_sum.get(key,0)返回0,否则返回当前值。

    我希望这足够清楚。

        2
  •  2
  •   dcolish    15 年前

    我想用 zip 是组合列表的好方法。这个 dict.update 部分将执行求和操作,因为我将获取上一个值并更新它:

    foo = dict()
    for x, y in zip(['A', 'B', 'C', 'D', 'A', 'B'],
                    [3, 2, 1, 2, 2, 1]):
        foo[x] = y + foo.get(x, 0)
    
    print foo
    

    输出: {'A': 5, 'C': 1, 'B': 3, 'D': 2}

    编辑:

    虽然上面没问题,但我也会考虑使用 itertools.izip 它允许你做 拉链 在你编字典的时候。这样可以节省内存。你所要做的就是更换 拉链 具有 itertools.izip 进口后 iterools

        3
  •  1
  •   SimonC    15 年前

    这是可以做到的,但是根据Pyfunc,有更好的方法:

    l2_sum = {}
    for i in range(0,len(L2)):
        key = L2[i]
        num = L3[i]
        l2_sum[key] = l2_sum.get(key, 0) + num
    
    L2_WANTED = sorted(l2_sum.keys())
    L3_WANTED = [l2_sum[key] for key in L2_WANTED]
    
    推荐文章