假设我有一个矩阵,例如
[['ID', 'fName', 'lName'],
['A101', 'Mark', 'Smith'],
['A102', 'Jane', 'Smith'],
['A103', 'Mark', 'Twain'],
['A104', 'Ann', 'Lee']]
请注意,部分单元格为''
我需要做的是从这个矩阵中创建2个词典:
我认为它就像获取每个列表一样简单(因为矩阵是一个列表列表)并使用它将它作为附加传递给字典,但是我很难写出那个部分。
迭代矩阵for i in xrange (0, len(matrix))
并使用i
作为示例matrix[i]
的标识符,但我不确定这是否正确以及制作这些词典的正确方法。< / p>
我有Python 2.7.2
答案 0 :(得分:6)
>>> dict((x[0], (x[1], x[2])) for x in names[1:])
{'A104': ('Ann', 'Lee'), 'A102': ('Jane', 'Smith'), 'A103': ('Mark', 'Twain'), 'A101': ('Mark', 'Smith')}
>>> dict((x[2], (x[0], x[1])) for x in names[1:])
{'Twain': ('A103', 'Mark'), 'Smith': ('A102', 'Jane'), 'Lee': ('A104', 'Ann')}
答案 1 :(得分:4)
根据您对其他答案的评论,我认为这需要分两个步骤,首先得到一个dicts列表,而不是&#34;矩阵&#34;你有问题,然后重新加工。
为完整起见,请设置
list_of_lists = [['ID', 'fName', 'lName'],
['A101', 'Mark', 'Smith'],
['A102', 'Jane', 'Smith'],
['A103', 'Mark', 'Twain'],
['A104', 'Ann', 'Lee']]
因此,要获得列表中的列表列表,您可以执行以下操作:
keys = list_of_lists[0]
data = [dict(zip(keys, values)) for values in list_of_lists[1:]]
data
现在包含一个词典列表。
[{'ID': 'A101', 'fName': 'Mark', 'lName': 'Smith'},
{'ID': 'A102', 'fName': 'Jane', 'lName': 'Smith'},
{'ID': 'A103', 'fName': 'Mark', 'lName': 'Twain'},
{'ID': 'A104', 'fName': 'Ann', 'lName': 'Lee'}]
现在,通过理解获得您想要的其他列表很简单:
[{d['ID']: (d['fName'], d['lName'])} for d in data]
我怀疑您可能正在使用csv
模块从文件中读取此列表列表。如果是这种情况,您可以使用DictReader
读取数据。所以假设你的文件是这样的:
ID,fName,lName
A101,Mark,Smith
A102,Jane,Smith
A103,Mark,Twain
A104,Ann,Lee
您可以通过
获取data
import csv
data = csv.DictReader(open('test.csv'))
答案 2 :(得分:2)
在python 2.7+中,您可以使用 dict comprehensions (类似于列表推导)来做同样的事情:
>>> {ID: (fname, lname) for (ID, fname, lname) in names[1:]}
{'A104': ('Ann', 'Lee'), 'A102': ('Jane', 'Smith'), 'A103': ('Mark', 'Twain'), 'A101': ('Mark', 'Smith')}
>>> {lname: (ID, fname) for (ID, fname, lname) in names[1:]}
{'Twain': ('A103', 'Mark'), 'Smith': ('A102', 'Jane'), 'Lee': ('A104', 'Ann')}
请注意,对于重复键的情况,表达式中的最后一个键将覆盖所有其他键,(此处,缺少“Smith”的其中一个条目)。解决此问题的一种方法是使用defaultdict
并允许dict值为条目列表,而不是单个条目:
>>> from collections import defaultdict
>>> by_lastname = defaultdict(list)
>>> for (ID, fname, lname) in names[1:]:
... by_lastname[lname].append((ID, fname))
...
>>> by_lastname
defaultdict(<type 'list'>, {'Twain': [('A103', 'Mark')], 'Smith': [('A101', 'Mark'), ('A102', 'Jane')], 'Lee': [('A104', 'Ann')]})
>>>