[英]Split List string and create dictionary
我有这个清单:
lst= ['1 5','1 12','1 55','2 95', '2 66', '3 45',...]
正如您所看到的,每个项目由2个数字组成,第二个数字最多为4个字符,并且它们以空格分隔。
我想把它转移到这样的字典中
dct={1:{'doc0005','doc0012','doc0055'},2:{'doc0095','doc0066'},3:{'doc0045'},...}
每个值项应该是7个字符长: 'doc'+someZeros+'second number
列表项中'doc'+someZeros+'second number
,其中someZeros是额外的0个字符,使值7个字符长。 第一个数字将是字典的关键
我试图拆分列表中的每个项目并通过循环将其添加到字典中,但我感到困惑
使用(默认)集合字典很容易做到这一点。
from collections import defaultdict
d = defaultdict(set)
for l in lst:
k, v = l.split()
d[k].add(f'doc{int(v):04d}') # "doc{:04d}".format(int(v))
print(d)
defaultdict(set,
{'1': {'doc0005', 'doc0012', 'doc0055'},
'2': {'doc0066', 'doc0095'},
'3': {'doc0045'}})
如果你喜欢一个普通的字典,或者dict
IFY上述结果,或使用稍微不同的(较少有效的解决方案),使用dict.setdefault
:
d = {}
for l in lst:
k, v = l.split()
d.setdefault(k, set()).add(f'doc{int(v):04d}') # "doc{:04d}".format(int(v))
print(d)
{'1': {'doc0005', 'doc0012', 'doc0055'},
'2': {'doc0066', 'doc0095'},
'3': {'doc0045'}}
这将是一个没有进口的解决方案:
lst= ['1 5','1 12','1 55','2 95', '2 66', '3 45']
result = {}
for i in lst:
k, v = i.split()
k = int(k)
v = 'doc{}'.format(v.zfill(4))
if k in result:
result[k].add(v)
else:
result[k] = {v}
print(result)
#{1: {'doc0005', 'doc0012', 'doc0055'}, 2: {'doc0095', 'doc0066'}, 3: {'doc0045'}}
或者简单的setdefault
:
d={}
for i in l:
d.setdefault(i.split()[0],set()).add('doc%04d' % int(i.split()[1]))
print(d)
如果列表是按每个字符串的关键部分排序的,则可以使用具有O( n )复杂度的groupby
:
from itertools import groupby
from operator import itemgetter
lst = ['1 5','1 12','1 55','2 95', '2 66', '3 45']
split = [list(map(int, item.split())) for item in lst]
grouper = groupby(split, key=itemgetter(0))
res = {i: {f'doc{x[1]:04d}' for x in j} for i, j in grouper}
# {1: {'doc0005', 'doc0012', 'doc0055'},
# 2: {'doc0066', 'doc0095'},
# 3: {'doc0045'}}
如果没有订购您的输入,您将需要先排序,这将是昂贵的。 在这种情况下,您可以根据此解决方案考虑set
collections.defaultdict
。
只是循环
d = {}
for i in lst:
if i.split()[0] not in d:
d[i.split()[0]] = 'doc{}'.format((i.split()[1]).zfill(4))
elif i.split()[0] in d:
d[i.split()[0]] += ', doc{}'.format(i.split()[1].zfill(4))
{'1': 'doc0005, doc0012, doc0055', '2': 'doc0095, doc0066', '3': 'doc0045'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.