繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM