【问题标题】:Python Matrix (list of lists) to dictionaryPython 矩阵(列表列表)到字典
【发布时间】:2012-10-22 05:45:11
【问题描述】:

假设我有一个矩阵,例如

[['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

【问题讨论】:

  • 感谢那些回答的人,我希望得到比这个矩阵更普遍的答案。对不起。我会玩这里给出的东西,如果我弄明白了,我会自己发布一个答案。

标签: python list dictionary matrix


【解决方案1】:
>>> 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')}

【讨论】:

  • 谢谢!有没有办法不假设标题或矩阵长度?我的示例矩阵更小且更通用,以便让其他人能够在将来使用这个想法。
  • 没有。您将不得不在 some 点将代码与结构耦合;这就是其中之一。
  • thx :) 我可以加载具有标题的矩阵的第一个列表并使用它们吗?
  • 当然,但这需要预处理。
  • 谢谢,我要玩这个!感谢你的帮助!本站规则!伟大的人也是如此!
【解决方案2】:

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

为了完整性,让我们设置

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'))

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢!有没有办法不假设标题或矩阵长度?我的示例矩阵更小且更通用,以便让其他人能够在将来使用这个想法。
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2017-09-11
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多