识别列表列表中具有3个共同点的列表

识别列表列表中具有3个共同点的列表,第1张

识别列表列表中具有3个共同点的列表

您可以使用相同的原理,方法是将前三个元素用作键,并将

int
用作默认值工厂
defaultdict
(这样您将获得
0
初始值):

from collections import defaultdicta_list = [['apple', 50, 60, 7],          ['orange', 70, 50, 8],          ['apple', 50, 60, 12]]d = defaultdict(int)for sub_list in a_list:    key = tuple(sub_list[:3])    d[key] += sub_list[-1]new_data = [list(k) + [v] for k, v in d.iteritems()]

如果您使用的是Python 3,则可以简化为:

d = defaultdict(int)for *key, v in a_list:    d[tuple(key)] += vnew_data = [list(k) + [v] for k, v in d.items()]

因为您可以使用加星标的目标从列表中获取所有“剩余”值,所以每个子列表主要分配给

key
,最后一个值分配给
v
,从而使循环变得更简单了(并且
.iteritems()
dict中没有方法Python
3,因为
.items()
已经是一个迭代器)。

所以,我们使用一个

defaultdict
使用
0
作为默认值,然后从第3个值产生的每个键(作为一个元组,所以你可以使用它作为一个字典的键)总结的最后一个值。

  • 因此,对于第一个项目,

    ['apple', 50, 60, 7]
    我们创建一个key
    ('apple', 50, 60)
    ,在
    d
    其中查找键(该键不存在,但是
    defaultdict
    int()
    用于创建新值
    0
    ),然后
    7
    从该第一项中添加。

  • ('orange', 70, 50)
    键和值执行相同的 *** 作
    8

  • 对于第3个项目,我们

    ('apple', 50, 60)
    再次获取密钥,并将其添加
    12
    到中已存在的密钥
    7
    d[('apple', 50, 60)]
    。共19个

然后,我们将(键,值)对重新放入列表中,您就完成了。结果是:

>>> new_data[['apple', 50, 60, 19], ['orange', 70, 50, 8]]

需要对数据进行排序的另一种实现方式是

itertools.groupby

from itertools import groupbyfrom operator import itemgettera_list = [['apple', 50, 60, 7],          ['orange', 70, 50, 8],          ['apple', 50, 60, 12]]newlist = [list(key) + [sum(i[-1] for i in sublists)]     for key, sublists in groupby(sorted(a_list), key=itemgetter(0, 1, 2))]

对于相同的输出。如果您的数据未排序,这会变慢,但是很高兴知道不同的方法。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5667540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存