当values_list具有多个元素时,从两个列表创建字典

时间:2019-10-04 16:07:22

标签: python dictionary

我想用这个变量制作一个字典(它的格式很奇怪,因为它来自文件):

lines_no_comments = ['v:A,E,I,O,U', 'c:C,K,Q', 'b:B,P,D,M', 'z:C,Z,S']

因此所需的输出将是:

dic_final = {
    'v':['A','E','I','O','U'],
    'c':['C','K','Q'],
    'b':['B','P','D','M'],
    'z':['C','Z','S']
}

我已经尝试过了:

dic_final={}
for i in range(len(lines_no_comments)):
    keys = [char.strip() for char in lines_no_comments[i].split(':')[0]]
    values = [char.strip() for char in lines_no_comments[i].split(':')[1].split(',')]
    dic = dict(zip(keys, values))
    dic = {k:v for k,v in zip(keys, values)}
    dic_final.update(dic)

为说明代码,在第一个循环中,变量键和值存储:

keys = ['v']
values = ['A', 'E', 'I', 'O', 'U']

dic_final的输出是

dic_final = {'v': 'A', 'c': 'C', 'b': 'B', 'z': 'C'}

似乎dict(zip(keys, values))并未添加向量dict的全部内容。如何添加其余的value元素?

5 个答案:

答案 0 :(得分:3)

您可以使用defaultdict设置list作为默认值,并通过相应的拆分遍历更新字典的字符串:

from collections import defaultdict

d = defaultdict(list)
for i in lines_no_comments:
    k,v = i.split(':')
    d[k] = v.split(',')

print(d)

defaultdict(list,
            {'v': ['A', 'E', 'I', 'O', 'U'],
             'c': ['C', 'K', 'Q'],
             'b': ['B', 'P', 'D', 'M'],
             'z': ['C', 'Z', 'S']})

答案 1 :(得分:3)

让我们了解代码中实际发生的情况。

    keys = [char.strip() for char in lines_no_comments[i].split(':')[0]]
    values = [char.strip() for char in lines_no_comments[i].split(':')[1].split(',')]

第一次迭代后,您会得到

keys = ['v']
values = ['A', 'E', 'I', 'O', 'U']

然后让我们了解zip的工作原理

  

返回一个元组的迭代器,其中第i个元组包含第i个   每个自变量序列或可迭代对象的元素。迭代器   当最短的输入可迭代耗尽时停止。

因此,压缩键和值将为您提供('v', 'A'),因为这2个中最短的只有一个值。 然后根据结果作出命令将只给您{'v': 'A'}。这就是为什么您的结果字典每个键只有一个值的原因。

由于keys实际上是key,因此您无需将其打包到列表中。 并且values已经是一个值列表,您无需弄乱这两个值,只需使用它更新您的最终字典 dic_final[key]=values

答案 2 :(得分:2)

您可以两次split(首先在:上,其次在,上)并传递到dict构造函数中:

dic_final = dict((a, b.split(",")) for a, b in (x.split(":") for x in lines_no_comments))
print(dic_final)
#{'b': ['B', 'P', 'D', 'M'],
# 'c': ['C', 'K', 'Q'],
# 'v': ['A', 'E', 'I', 'O', 'U'],
# 'z': ['C', 'Z', 'S']}

答案 3 :(得分:2)

这是一种实现方法:

lines_no_comments  = ['v:A,E,I,O,U', 'c:C,K,Q', 'b:B,P,D,M', 'z:C,Z,S']
dic_final  = dict()
for line in lines_no_comments:
    key = line.split(':')[0]
    val = line.split(':')[1].split(',')
    dic_final.update({key:val})

答案 4 :(得分:1)

当然有多种方法可以完成任务,但是我想实际回答一个问题:为什么观察到结果?

此代码混合了两种方法:一次完成或逐项完成。

没有for循环(单发方法),则看起来像这样:

keys = [line.split(':', 1)[0].strip() for line in lines_no_comments]
values = [line.split(':')[1].split(',').strip() for line in lines_no_comments]
dic_final = dict(zip(keys, values))

通过循环,它将是:

for line in lines_no_comments:
    key = line.split(':', 1)[0]
    values = line.split(':', 1)[1].split(',')
    dic_final[key] = value

可能最好的避免方法是在编写代码之前仔细考虑一下算法。人们通常不擅长同时设计和实现