【问题标题】:Incorporate duplicates in a list of tuples into a dictionary summing the values将元组列表中的重复项合并到对值求和的字典中
【发布时间】:2016-10-16 05:19:28
【问题描述】:

您好,我希望将此元组列表转换为字典。由于我是 python 新手,我正在想办法转换成字典。如果只有一个值,我只能转换为字典。就我而言,其中有两个值。我将在下面进行更多详细说明:

    `List of tuples: [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1),
('Samsung','Tablet',10),('Sony','Handphone',100)]`

正如您在上面看到的,我希望将“Samsung”标识为键,将“Handphone”和“10”标识为与该键相关的值。

我想要的输出是:

  `Output: {'Sony': ['Handphone',100], 'Samsung': ['Tablet',10,'Handphone', 9]}`

正如您在上面看到的,项目“手机”和“平板电脑”是根据关键值分组的,在我的例子中是索尼和三星。如果它们属于相同的项目和相同的键(Samsung 或 Sony),则项目的数量会被添加/减去。

我非常感谢你们为实现上述输出而提出的任何建议和想法。我真的没有主意了。谢谢你。

【问题讨论】:

  • Samsung 在您的列表中出现多次。字典只能有一个键的实例。具有相同键的多个条目应该发生什么?
  • 我建议使用字典字典,而不是您要求的(无效)输出格式。此格式的结果:{'Sony': {'Handphone': 100}, 'Samsung': {'Handphone': 9, 'Tablet': 10}}
  • 嗨@John1024,对不起。我能问一下为什么我想要的输出不是有效的字典吗?
  • @user3271404 您想要的输出现在在语法上是正确的,但它是一个难以创建的输出,并且不能很好地代表这个想法。 Josha 和 Seiji 的答案显示了使用嵌套字典的表示,该字典直观地捕获了您要表示的内容。新的期望输出需要将偶数索引处的元素解释为“对象类型”,并将后续元素解释为其计数。例如,索引 2 是键“Handphone”,索引 3 是手机的数量。虽然这在技术上是可行的,但它是对列表的滥用。 (续...)
  • (续)除了增加复杂性之外,这种数据结构在大型数据集上的性能也会很差。它要求您搜索整个项目类型列表以找到您要查找的内容。如果您有 1000 种制造商的项目类型,平均而言,您必须搜索 1000 个元素才能找到计数的存储位置。

标签: python list dictionary tuples counter


【解决方案1】:

defaultdict 的好机会

from collections import defaultdict

the_list = [
    ('Samsung', 'Handphone', 10), 
    ('Samsung', 'Handphone', -1), 
    ('Samsung', 'Tablet', 10),
    ('Sony', 'Handphone', 100)
]

d = defaultdict(lambda: defaultdict(int))

for brand, thing, quantity in the_list:
    d[brand][thing] += quantity

结果将是

{
    'Samsung': {
        'Handphone': 9, 
        'Tablet': 10
    },
    'Sony': {
        'Handphone': 100
    }
}

【讨论】:

  • 嗨@Josha Inglis,如何产生上面的结果?我试过了,但我做不到。对不起。谢谢。
  • 嗨@user3271404,您应该能够复制/粘贴上面的答案,然后print(d) 以查看字典。
  • 要访问'Samsung' 'Handphone',可以使用d['Samsung']['Handphone']
  • 罗杰,非常感谢您提供更多信息。但是,当我尝试打印 d 时,它显示 defaultdict(<function <lambda> at 0x02845C70>, {'Sony': defaultdict(<type 'int'>, {'Handphone': 100}),知道如何删除它吗?谢谢!
  • 罗杰,非常感谢您提供更多信息。但是,当我尝试打印 d 时,它显示 defaultdict(<function <lambda> at 0x02845C70>, {'Sony': defaultdict(<type 'int'>, {'Handphone': 100}),知道如何删除“defaultdict( at 0x02845C70>”吗?谢谢!
【解决方案2】:

你可以通过字典理解来做到这一点

您真正想要的是 元组 键,这将是公司和设备。

tuples = [('Samsung', 'Handphone',10), 
          ('Samsung', 'Handphone',-1),
          ('Samsung','Tablet',10),
          ('Sony','Handphone',100)]

d = {}
for company, device, n in tuples:
    key = (company, device)
    d[key] = d.get(key, 0) + n

【讨论】:

  • 这不会添加匹配的“三星手机”项目。每个新的三星项目都会覆盖之前的项目。
  • @Wehrdo 啊,从问题中并不清楚他们想要什么。
  • 嗨@Wehrdo,很抱歉这个问题有歧义。我试图尽可能清楚。你有什么建议让我的问题更清楚?谢谢!
【解决方案3】:

您的输出有问题,可以通过正确的标识看到:

{
    'Sony': ['Handphone',100], 
    'Samsung': ['Tablet',10],
    ['Handphone', 9]
}

手机不是“三星”的一部分,你可以做一个列表来获取:

{
    'Sony': [
        ['Handphone',100]
    ],
    'Samsung': [
        ['Tablet',10],
        ['Handphone', 9]
    ]
}

与:

my_list = [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1), ('Samsung','Tablet',10),('Sony','Handphone',100)]

result = {}
for brand, device, value in my_list:
    # first verify if key is present to add list for the first time
    if not brand in result:
        result[brand] = []
    # then add new list to already existent list
    result[brand] += [[device, value]]

但我认为最好的格式是字典:

{
    'Sony': {
        'Handphone': 100
    },
    'Samsung': {
        'Tablet': 10,
        'Handphone': 9
    }
}

那就是:

my_list = [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1), ('Samsung','Tablet',10),('Sony','Handphone',100)]

result = {}
for brand, device, value in my_list:
    # first verify if key is present to add dict for the first time
    if not brand in result:
        result[brand] = {}
    # then add new key/value to already existent dict
    result[brand][device] = value

【讨论】:

  • 嗨@Seiji Hirao,如何产生结果?我无法得到它。对不起。谢谢。
  • 对不起,我的 python 刚刚出现了一些问题。我已经可以打印输出了。感谢您清晰简洁的解释。我已经了解它是如何工作的。杰出的!非常感谢!
  • 我很高兴它有帮助 ;)
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2021-08-07
  • 2015-05-02
  • 2020-05-30
  • 1970-01-01
相关资源
最近更新 更多