拆分列表字符串并创建字典

时间:2018-09-25 23:40:54

标签: python

我有这个列表:

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个字符。第一个数字将是字典的键

我试图拆分列表中的每个项目,并通过循环将其添加到字典中,但是我很困惑

5 个答案:

答案 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.defaultdictset

答案 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'}