如何将Python元组转换为字典

如何将Python元组转换为字典,python,dictionary,tuples,Python,Dictionary,Tuples,为了将t=[('a',1),('b',2),('c',3),('a',4)]转换为dict,我希望输出是{'a':5,'b':2,'c':3},而不是{'a':4,'b':2,'c':3}。 有没有办法将同一关键项的值相加 我使用此行转换元组: dict((x,y) for x, y in t) 使用itertools.groupby: from itertools import groupby t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)] f

为了将
t=[('a',1),('b',2),('c',3),('a',4)]
转换为dict,我希望输出是
{'a':5,'b':2,'c':3}
,而不是
{'a':4,'b':2,'c':3}
。 有没有办法将同一关键项的值相加

我使用此行转换元组:

dict((x,y) for x, y in t)

使用
itertools.groupby

from itertools import groupby

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

f = lambda x: x[0]
print({k: sum(x[1] for x in g) for k, g in groupby(sorted(t, key=f), key=f)})

# {'a': 5, 'b': 2, 'c': 3}
collections.defaultdict

from collections import defaultdict

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

d = defaultdict(int)
for x in t:
    d[x[0]] += x[1]

print(d)

# {'a': 5, 'b': 2, 'c': 3}

使用
itertools.groupby

from itertools import groupby

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

f = lambda x: x[0]
print({k: sum(x[1] for x in g) for k, g in groupby(sorted(t, key=f), key=f)})

# {'a': 5, 'b': 2, 'c': 3}
collections.defaultdict

from collections import defaultdict

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

d = defaultdict(int)
for x in t:
    d[x[0]] += x[1]

print(d)

# {'a': 5, 'b': 2, 'c': 3}
方法#1: 以下是最快的方法:

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

out = {}
for x, y in t:
    if x in out:out[x] += y
    else:out[x] = y
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

d = dict.fromkeys(dict(t), 0)
for x, y in t: d[x] += y
输出:

方法2: 这是最简单的方法:

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

out = {}
for x, y in t:
    if x in out:out[x] += y
    else:out[x] = y
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

d = dict.fromkeys(dict(t), 0)
for x, y in t: d[x] += y
输出:


我最快方法的证明: 我使用
timeit
来计算用户回答的每个方法需要多少时间。最快的是我的(方法1):

我的平台上的输出是:

所以最快的方法是我回答的方法8(方法1)。

方法1: 以下是最快的方法:

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

out = {}
for x, y in t:
    if x in out:out[x] += y
    else:out[x] = y
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

d = dict.fromkeys(dict(t), 0)
for x, y in t: d[x] += y
输出:

方法2: 这是最简单的方法:

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

out = {}
for x, y in t:
    if x in out:out[x] += y
    else:out[x] = y
t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]

d = dict.fromkeys(dict(t), 0)
for x, y in t: d[x] += y
输出:


我最快方法的证明: 我使用
timeit
来计算用户回答的每个方法需要多少时间。最快的是我的(方法1):

我的平台上的输出是:


因此,最快的方法是我回答的方法8(方法1)。

您可以编写一个函数,检查字典中是否已经存在密钥。类似这样的方法会奏效:

d=dict()
对于t中的x,y:
如果x在d中:
d[x]+=y
其他:
d[x]=y
这将为您提供正确的输出:

{'a': 5, 'b': 2, 'c': 3}

您可以编写一个函数来检查该键是否已存在于字典中。类似这样的方法会奏效:

d=dict()
对于t中的x,y:
如果x在d中:
d[x]+=y
其他:
d[x]=y
这将为您提供正确的输出:

{'a': 5, 'b': 2, 'c': 3}

这几乎是源于

在解释器中验证

In [1]: from collections import defaultdict
   ...:
   ...: t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
   ...: char_to_int = defaultdict(int)
   ...:
   ...: for k, v in t:
   ...:     char_to_int[k] += v
   ...:

In [2]: char_to_int
Out[2]: defaultdict(int, {'a': 5, 'b': 2, 'c': 3})

这几乎是源于

在解释器中验证

In [1]: from collections import defaultdict
   ...:
   ...: t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
   ...: char_to_int = defaultdict(int)
   ...:
   ...: for k, v in t:
   ...:     char_to_int[k] += v
   ...:

In [2]: char_to_int
Out[2]: defaultdict(int, {'a': 5, 'b': 2, 'c': 3})

我的方法:使用默认值为0的get

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
d = dict()
for x,y in t:
    d[x] = d.get(x, 0) + y;
print(d)

我的方法:使用默认值为0的get

t = [('a', 1), ('b', 2), ('c', 3), ('a', 4)]
d = dict()
for x,y in t:
    d[x] = d.get(x, 0) + y;
print(d)
尝试:

t=((1,'a'),(2,'b')) >>>dict((y,x)表示x,y表示t) {'a':1,'b':2}试试:

t=((1,'a'),(2,'b')) >>>dict((y,x)表示x,y表示t)
{'a':1,'b':2}您是否在询问是否存在此表达式的单个表达式?因为您肯定可以看到,从一个空字典开始,编写一个for循环来检查每个元组,或者添加一个新的字典项,或者将一个值累加到现有的字典项中,这非常简单。你在找更简单的吗?没错。我实际上是想用一行代码来表达它。你是在问这个是否有一个表达式?因为您肯定可以看到,从一个空字典开始,编写一个for循环来检查每个元组,或者添加一个新的字典项,或者将一个值累加到现有的字典项中,这非常简单。你在找更简单的吗?没错。实际上,我正试图用一行代码来表达它。OP:defaultdict的旁注更有效,因为groupby首先需要排序。您的第一个方法是所有方法中最慢的方法。您可能想查看我的答案中的详细信息。表示OP:defaultdict更有效,因为groupby首先需要排序。您的第一个方法是所有方法中最慢的方法。你可能想查看我的答案了解详情这不是OP想要的这不是OP想要的