Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将元组列表中的重复项合并到对值求和的字典中_Python_List_Dictionary_Tuples_Counter - Fatal编程技术网

Python 将元组列表中的重复项合并到对值求和的字典中

Python 将元组列表中的重复项合并到对值求和的字典中,python,list,dictionary,tuples,counter,Python,List,Dictionary,Tuples,Counter,嗨,我想把这个元组列表转换成字典。由于我是python新手,我正在寻找将其转换为字典的方法。我只能在只有一个值的情况下转换为字典。在我的例子中,有两个值。我将在下面详细说明: `List of tuples: [('Samsung', 'Handphone',10), ('Samsung', 'Handphone',-1), ('Samsung','Tablet',10),('Sony','Handphone',100)]` 如上所述,我希望将“Samsung”标识为键,“Handph

嗨,我想把这个元组列表转换成字典。由于我是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]}`
正如你在上面看到的,“手机”和“平板电脑”是根据关键值分组的,在我的例子中是索尼和三星。如果物品属于同一物品和同一钥匙(三星或索尼),则增加/减少物品数量


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

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

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

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

你可以用字典来理解

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

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

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
    }
}

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
    }
}

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

{
    'Sony': ['Handphone',100], 
    'Samsung': ['Tablet',10],
    ['Handphone', 9]
}
手机不是“三星”的一部分,您可以列出一系列列表来获取:

{
    '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 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

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

{
    'Sony': ['Handphone',100], 
    'Samsung': ['Tablet',10],
    ['Handphone', 9]
}
手机不是“三星”的一部分,您可以列出一系列列表来获取:

{
    '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 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


Samsung
会多次出现在您的列表中。字典只能有一个键的实例。对于具有相同键的多个条目会发生什么情况?我建议使用字典字典,而不是您请求的(无效)输出格式。结果是这样的:{'Sony':{'Handphone':100},'Samsung':{'Handphone':9,'Tablet':10}}}嗨@John1024,对不起。我可以问一下为什么我想要的输出不是一个有效的字典吗?@user3271404您想要的输出现在在语法上是正确的,但是它是一个很难创建的输出,并且不能很好地代表这个想法。Josha和Seiji的答案显示了一个使用嵌套字典的表示法,直观地捕获了您试图表示的内容。新的期望输出要求将偶数索引中的元素解释为“对象类型”,并将后续元素解释为其计数。e、 g,索引2是键“手持电话”,索引3是手持电话的数量。虽然这在技术上是可行的,但却是对清单的滥用。(续…)除了增加复杂性,这种数据结构在大型数据集上的性能也会很差。它要求您搜索整个项目类型列表,以找到您要查找的内容。如果一个制造商有1000种商品类型,平均而言,您必须搜索1000个元素才能找到存储计数的位置。
Samsung
在您的列表中多次出现。字典只能有一个键的实例。对于具有相同键的多个条目会发生什么情况?我建议使用字典字典,而不是您请求的(无效)输出格式。结果是这样的:{'Sony':{'Handphone':100},'Samsung':{'Handphone':9,'Tablet':10}}}嗨@John1024,对不起。我可以问一下为什么我想要的输出不是一个有效的字典吗?@user3271404您想要的输出现在在语法上是正确的,但是它是一个很难创建的输出,并且不能很好地代表这个想法。Josha和Seiji的答案显示了一个使用嵌套字典的表示法,直观地捕获了您试图表示的内容。新的期望输出要求将偶数索引中的元素解释为“对象类型”,并将后续元素解释为其计数。e、 g,索引2是键“手持电话”,索引3是手持电话的数量。虽然这在技术上是可行的,但却是对清单的滥用。(续…)除了增加复杂性,这种数据结构在大型数据集上的性能也会很差。它要求您搜索整个项目类型列表,以找到您要查找的内容。如果一个制造商有1000种商品类型,则平均而言,您必须搜索1000个元素才能找到存储计数的位置。这不包括添加匹配的“三星手机”商品。三星的每一项新产品都将覆盖上一项。@Wehrdo啊,从问题中不太清楚他们想要什么。您好@Wehrdo,很抱歉问题模棱两可。我正在尽可能地弄清楚。你有什么建议让我的问题更清楚?非常感谢。这并没有添加匹配的“三星手机”项目。三星的每一项新产品都将覆盖上一项。@Wehrdo啊,从问题中不太清楚他们想要什么。您好@Wehrdo,很抱歉问题模棱两可。我正在尽可能地弄清楚。你有什么建议让我的问题更清楚?非常感谢。嗨@Josha Inglis,如何产生上述结果?我试过了,但不行。对不起谢谢。您好@user3271404您应该能够复制/粘贴上面的答案,然后
打印(d)
查看字典。要访问
'Samsung'
'Handphone'
,您可以使用
d['Samsung']['Handphone']
罗杰,谢谢您提供的更多信息。然而,当我尝试打印d时,它会显示
defaultdict(,{'Sony':defaultdict(,{'Handphone':100})
,你知道如何删除这个吗?谢谢!罗杰,谢谢你这么多额外的信息。然而,当我尝试打印d时,它会显示
defaultdict(,{'Sony':defaultdict(,{'Handphone':100})
,你知道如何删除“defaultd”吗