在Python中,将包含关键字对的列表添加到字典最简单的方法是什么?
问题描述:
我在Python中有作业问题。
我在Linux上使用Python 3.4.0版。
,我读一个CSV文件中的设计文件规定使用内置的功能,指定为NAMES.DAT,这是格式:
在Python中,将包含关键字对的列表添加到字典最简单的方法是什么?
name:name2, name:name3, name2:name4, name3:name5\n (etc)
我然后将这些关键字对添加到字典,这是我坚持的部分。
我迄今的代码是这样的:
dictionary = dict()
database = open('names.dat', 'r')
data = database.read()
data = data.rstrip('\n')
data = data.split(',')
for item in range(len(data)):
dictionary.update(data[item-1])
我的想法是,如果我在格式列表元素“名称:NAME2”,我打电话与元素作为词典更新功能参数,它会正确映射到字典中的一个关键字对。
然而,这种情况并非如此,因为我当我运行该脚本得到这个错误:
File "MyName.py", line 7, in <module>
dictionary.update(data[item-1])
ValueError: dictionary update sequence element #0 has length 1; 2 is required
This和This看起来相似,但我觉得这就够了不同的问题,值得单独响应。
我在这里做错了什么,我该如何解决?
有没有更简单的方法来做到这一点?
答
@Paulo Scardine有一个伟大的答案,如果你想创建一个从指定csv一个确切的数据集。如果你想基于密钥一个可以使用它来组合值:
changes = {}
with open('test.csv', 'r') as f:
for row in f:
for e in row.rstrip('\n').split(", ") : #split lines by column
print (e) #just to show what is being generated here
(k,v) = e.split(":") #split further into key, value pairs
changes.setdefault(k, []).append(v)
#creates empty list if new key, adds value to list
print (changes)
数据看起来就像是:
{'name3': ['name5'], 'name2': ['name4', 'name6', 'name5'], 'name1': ['name', 'name4'], 'name': ['name2', 'name3']}
这可能是进一步简化,但我认为这给了很好的例子,有人学习可以遵循。
编辑:以下@Paulo Scardine评论
答
试试这个:
data = []
with open('names.dat') as database:
for line in database:
if line.strip(): # skip blank lines
data.append(
dict(i.split(":") for i in line.rstrip('\n').split(","))
)
如果你的文件是:
name:name2,name:name3,name2:name4,name3:name5
name:name2,name:name3,name2:name4,name3:name5
name:name2,name:name3,name2:name4,name3:name5
name:name2,name:name3,name2:name4,name3:name5
data
将是:
[{'name': 'name3', 'name2': 'name4', 'name3': 'name5'},
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'},
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'},
{'name': 'name3', 'name2': 'name4', 'name3': 'name5'}]
也许你想要的,而不是list
list
的dict
dict
:
data = {}
with open('names.dat') as database:
for line in database:
if line.strip(): # skip blank lines
for k, v in (i.split(":") for i in line.rstrip('\n').split(",")):
data.setdefault(k, []).append(v)
所得:
{'name': [ 'name2', 'name3', 'name2', 'name3', 'name2', 'name3', 'name2', 'name3'],
'name2': ['name4', 'name4', 'name4', 'name4'],
'name3': ['name5', 'name5', 'name5', 'name5']}
这个成语添加setDefault方法是如此普遍在Python,有一些语法糖吧:看'dict.setdefault'和'collections.defaultdict'。 – 2015-03-19 03:58:02
整洁,我一直在从我的AI类从R移动到Python,这些方法可能会为我节省一些头痛的问题 – JGreenwell 2015-03-19 04:05:54