Python矩阵(列表列表)到字典

时间:2012-10-22 05:45:12

标签: python list dictionary matrix

假设我有一个矩阵,例如

[['ID', 'fName', 'lName'],
['A101', 'Mark', 'Smith'],
['A102', 'Jane', 'Smith'],
['A103', 'Mark', 'Twain'],
['A104', 'Ann', 'Lee']]

请注意,部分单元格为''

我需要做的是从这个矩阵中创建2个词典:

  1. 使用ID作为键,使用fname和lname作为其值
  2. 使用lName作为ID作为键,使用fName作为值
  3. 我认为它就像获取每个列表一样简单(因为矩阵是一个列表列表)并使用它将它作为附加传递给字典,但是我很难写出那个部分。

    迭代矩阵for i in xrange (0, len(matrix))并使用i作为示例matrix[i]的标识符,但我不确定这是否正确以及制作这些词典的正确方法。< / p>

    我有Python 2.7.2

3 个答案:

答案 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')]})
>>>