3

假设我有一个矩阵,例如

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

请注意,某些单元格是 ''

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

  1. 使用 ID 作为键,使用 fname 和 lname 作为其值
  2. 使用 lName 作为键,ID 和 fName 作为值

我认为这就像获取每个列表一样简单(因为矩阵是列表的列表)并使用它将它作为附加传递给字典,但我很难写出那部分。

例如,迭代矩阵for i in xrange (0, len(matrix))i用作标识符,matrix[i]但我不确定这是否正确以及制作这些字典的正确方法是什么。

我有 Python 2.7.2

4

3 回答 3

8
>>> 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')}
于 2012-10-22T05:49:18.553 回答
4

从您对其他答案的评论来看,我认为这需要一个两步过程,首先获取一个字典列表,而不是您在问题中拥有的“矩阵”,然后对其进行修改。

为了完整起见,让我们设置

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

因此,要将您拥有的列表列表放入 dicts 列表中,您可以执行以下操作:

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'))
于 2014-06-27T08:08:14.937 回答
2

在 python 2.7+ 中,您可以使用字典推导(类似于列表推导)来做同样的事情:

>>> {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”的条目之一)。解决此问题的一种方法是使用 adefaultdict并允许 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')]})
>>> 
于 2012-10-22T06:03:41.723 回答