[英]In python - how do I convert items to dict?
I have following list of items (key-value pairs):我有以下项目列表(键值对):
items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
What I want to get:我想得到什么:
{
'A' : 1,
'B' : [1,2]
'C' : 3
}
My naive solution:我天真的解决方案:
res = {}
for (k,v) in items:
if k in res:
res[k].append(v)
else:
res[k] = [v]
I'm looking for some optimised more pythonic solution, anyone?我正在寻找一些优化的更 Pythonic 的解决方案,有人吗?
Use could use defaultdict here. 使用这里可以使用defaultdict。
from collections import defaultdict
res = defaultdict(list)
for (k,v) in items:
res[k].append(v)
# Use as dict(res)
EDIT: 编辑:
This is using groupby, but please note, the above is far cleaner and neater to the eyes : 这是使用groupby的方法,但请注意, 上面的方法更干净,更整洁 :
>>> data = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
>>> dict([(key,list(v[1] for v in group)) for (key,group) in groupby(data, lambda x: x[0])])
{'A': [1], 'C': [3], 'B': [1, 2]}
Downside : Every element is a list. 缺点 :每个元素都是一个列表。 Change lists to generators as needed.
根据需要将列表更改为生成器。
To convert all single item lists to individual items: 要将所有单个项目列表转换为单个项目:
>>> res = # Array of tuples, not dict
>>> res = [(key,(value[0] if len(value) == 1 else value)) for key,value in res]
>>> res
[('A', 1), ('B', [1, 2]), ('C', 3)]
If you don't want to use defaultdict
/ groupby
, the following works: 如果您不想使用
defaultdict
/ groupby
,则可以使用以下方法:
d = {}
for k,v in items:
d.setdefault(k, []).append(v)
This is very easy to do with defaultdict
, which can be imported from collections
. 使用
defaultdict
非常容易做到这一点,可以从collections
导入defaultdict
。
>>> from collections import defaultdict
>>> items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
>>> d = defaultdict(list)
>>> for k, v in items:
d[k].append(v)
>>> d
defaultdict(<class 'list'>, {'A': [1], 'C': [3], 'B': [1, 2]})
You can also use a dictionary comprehension: 您还可以使用字典理解:
>>> d = {l: [var for key, var in items if key == l] for l in {v[0] for v in items}}
>>> d
{'A': [1], 'C': [3], 'B': [1, 2]}
You can use the WebOb multidict implementation: 您可以使用WebOb multidict实现:
>>> from webob import multidict
>>> a = multidict.MultiDict(items)
>>> a.getall('B')
[1,2]
Maybe it looks ugly, but it works. 也许看起来很丑,但是行得通。
In [1]: items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
In [2]: d = {}
In [3]: map(lambda i: d.update({i[0]: i[1] if d.get(i[0], i[1]) == i[1] else [d[i[0]], i[1]]}), items)
Out[3]: [None, None, None, None]
In [4]: print d
{'A': 1, 'C': 3, 'B': [1, 2]}
In else
branch we can check if d[i[0]]
returns a list. 在
else
分支中,我们可以检查d[i[0]]
返回列表。
To convert dictionary to list of items将字典转换为项目列表
dict_items = list(dict_1.items())
To convert the list of items back to the dictionary将项目列表转换回字典
dict2 = dict(dict_items)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.