我有这个列表:
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
,其中someZeros额外为0个字符,以使值长度为7个字符。第一个数字将是字典的键
我试图拆分列表中的每个项目,并通过循环将其添加到字典中,但是我很困惑
答案 0 :(得分:3)
使用(默认)集合字典很容易做到这一点。
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
修改上面的结果,或者使用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'}}
答案 1 :(得分:1)
这是一种无需导入的解决方案:
(.)
答案 2 :(得分:1)
或者简单的setdefault
:
d={}
for i in l:
d.setdefault(i.split()[0],set()).add('doc%04d' % int(i.split()[1]))
print(d)
答案 3 :(得分:1)
如果列表是按每个字符串的关键部分排序的,则可以使用groupby
,其复杂度为O( n ):
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'}}
如果未订购您的输入,则需要首先进行排序,这将非常昂贵。在这种情况下,您可以按照this solution来考虑collections.defaultdict
和set
。
答案 4 :(得分:0)
只是循环
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'}