我想用这个变量制作一个字典(它的格式很奇怪,因为它来自文件):
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元素?
答案 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
可能最好的避免方法是在编写代码之前仔细考虑一下算法。人们通常不擅长同时设计和实现