【问题标题】:Create dictionary from 2-D list从二维列表创建字典
【发布时间】:2014-05-03 19:44:43
【问题描述】:

我需要创建一个字典,以作者的姓氏和名字作为键,手头的数量、价格和书名作为值。

[['Shakespeare', 'William', 'Rome And Juliet', '5', '5.99'], ['Shakespeare', 'William', 'Macbeth', '3', '7.99'], ['Dickens', 'Charles', 'Hard Times', '7', '27.00'], ['']]

到目前为止,我已经编译了这个二维列表,但我被困住了。

任何帮助将不胜感激!

【问题讨论】:

  • 为了将来参考,如果您包含任何您已经用来尝试自己解决此问题的代码,您可能会获得更多帮助。
  • 当作者写了不止一本书时,您希望其价值是多少,就像您的示例数据中的莎士比亚一样?

标签: python python-3.x dictionary 2d


【解决方案1】:

听起来您对 Python 的经验并不多。您应该注意本教程的以下部分(当您完成整个教程时,这非常值得您花时间!):looping techniquesdictionariestuples and sequences

最后,您可能会想要一些类似的东西:

>>> books = [['Shakespeare', 'William', 'Rome And Juliet', '5', '5.99'], ['Shakespeare', 'William', 'Macbeth', '3', '7.99'], ['Dickens', 'Charles', 'Hard Times', '7', '27.00'], ['']]
>>> d = dict()
>>> for book in books:
    if book and len(book) > 3:  # make sure book list is not empty and has more than three elements
        d[tuple(book[:2])] = book[3:] + [book[2]]  # make sure value reflects your desired order

>>> d
{('Dickens', 'Charles'): ['7', '27.00', 'Hard Times'], ('Shakespeare', 'William'): ['3', '7.99', 'Macbeth']}

注意字典键必须是不可变的,所以我把d的每个键都做成了一个元组。

【讨论】:

  • 感谢您的链接!不,我没有太多经验。只是读一本书,努力学习我能做到的最好的东西。遇到了这个问题,无法解决。
【解决方案2】:

下面将创建一个字典,将每个作者的姓名映射到他们所写书籍的list。这是使用名为defaultdict 的内置字典类型的特化完成的,该字典类型在collections 模块中定义。

from collections import defaultdict
from pprint import pprint

books = [['Shakespeare', 'William', 'Rome And Juliet', '5', '5.99'],
         ['Shakespeare', 'William', 'Macbeth', '3', '7.99'],
         ['Dickens', 'Charles', 'Hard Times', '7', '27.00'],
         ['']]

d = defaultdict(list)
for book in (book for book in books if book[0]):
    d[book[0], book[1]].append(book[2:])

pprint(d)

输出:

{('Dickens', 'Charles'): [['Hard Times', '7', '27.00']],
 ('Shakespeare', 'William'): [['Rome And Juliet', '5', '5.99'],
                              ['Macbeth', '3', '7.99']]}

【讨论】:

  • 哇,我什至不知道默认字典。实际上你做得很完美,因为作者可以有多本书,因此一个键有多个值。
  • 是的,defaultdict 对于需要将键映射到多个值的字典很方便,因为添加第一个不需要作为特殊情况处理。如果这最好地回答了您的问题,请接受它。如果您不确定如何操作,请参阅问题How does accepting an answer work?
  • 我怎样才能用这些值制作一个二维列表?所以这本书将是一个更大的列表,它会包含另一个列表,其中包含 2 个数字。
  • 与每个作者姓名键关联的值是一个列表列表(也称为二维列表)。您可以根据需要附加任意数量的不同长度的附加内容。我的答案中的代码适用于任意数量书籍的作者。
  • 有了这本词典,我希望能够更改价格和数量,添加更多作者,以及将书籍添加到列表中的作者。根据您的评论,这将适用于添加作者。其他的呢?
猜你喜欢
  • 2014-04-19
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多