首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python -如果前一个变量与alist中的现有元素相同,则对数字求和

python -如果前一个变量与alist中的现有元素相同,则对数字求和
EN

Stack Overflow用户
提问于 2018-02-15 23:03:52
回答 3查看 46关注 0票数 0

我在alist里面有一个alist,看起来是这样的:

代码语言:javascript
复制
sub_count = [[['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium'], 1]]

我需要什么,以获得一个新的字典与农场为关键字,以及订阅名称列表

即Red Hat Enterprise Linux for Virtual Datacenter with Smart Management、Premium/standard和每个订阅的订阅摘要

示例:

代码语言:javascript
复制
dic = {Farm:[Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium,3][Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard,2]}

注意:我已经尝试创建一个新的列表,并尝试下面的方法来获得我作为list的结果,但没有得到正确的结果,实际上我更喜欢adict:

代码语言:javascript
复制
['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart 
Management, Premium', 2, 'Farm', u'Red Hat Enterprise Linux for Virtual 
Datacenters with Smart Management, Standard', 2, 'Farm', u'Red Hat Enterprise 
Linux for Virtual Datacenters with Smart Management, Premium', 1]


list2 = []
for i in list1:
    if i not in list2:
        if not isinstance(i, (int, long)):
            list2.append(i)
        if isinstance(i, (int, long)):
            count = 0
            count = count + i:
            list2.append(count)

获取:

代码语言:javascript
复制
['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium', 2, u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard', 1]

请提供一种方法来获得上述示例中的dic

EN

回答 3

Stack Overflow用户

发布于 2018-02-15 23:18:56

您可以使用intdefaultdictdefaultdict

代码语言:javascript
复制
from collections import defaultdict
d = defaultdict(lambda: defaultdict(int))
for (a, b), c in sub_count:
    d[a][b] += c

结果是(为了可读性,省略了defaultdict-specific标记)

代码语言:javascript
复制
{'Farm': {'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium': 3, 
          'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard': 2})})
票数 1
EN

Stack Overflow用户

发布于 2018-02-15 23:20:17

我已经这样做了:

代码语言:javascript
复制
a_dict =defaultdict(dict)
for x in sub_count:
    if a_dict[x[0][0]].get(x[0][1]):
        a_dict[x[0][0]][x[0][1]] += x[1]
    else:
        a_dict[x[0][0]][x[0][1]] = x[1]

下面是输出:

代码语言:javascript
复制
defaultdict(dict,
            {'Farm': {u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium': 3,
              u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard': 2}})
票数 0
EN

Stack Overflow用户

发布于 2018-02-15 23:24:23

您可以使用itertools.groupby

代码语言:javascript
复制
import itertools
sub_count = [[['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Premium'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Standard'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Premium'], 1]]
final_data = {a:[zip(*list(d)) for c, d in itertools.groupby(sorted(list(b), key=lambda x:x[0][-1]), key=lambda x:x[0][-1])] for a, b in itertools.groupby(sub_count, key=lambda x:x[0][0])}
new_final_data = {a:[i[0]+[sum(c)] for i, c in b] for a, b in final_data.items()}

输出:

代码语言:javascript
复制
{'Farm': [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Premium', 3], ['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Standard', 2]]}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48810273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档