【问题标题】:Creating Dictionary and Integer Key for List of Strings in Python在 Python 中为字符串列表创建字典和整数键
【发布时间】:2016-10-06 04:48:16
【问题描述】:

我有一个 unicode 字符串列表。

每个字符串列表代表一个不同的文档,其中的字符串代表作者的姓名。有些文档只有一位作者,而其他文档可以有多个共同作者。

例如,三个文档的作者身份示例如下所示:

authors = [[u'Smith, J.', u'Williams, K.', u'Daniels, W.'], [u'Smith, J.'], [u'Williams, K.', u'Daniels, W.']]

我想将我的列表转换成字典和列表。

首先,一个为每个名字提供一个整数键的字典:

author_name = {0: u'Smith, J.', 1: u'Williams, K.', 2: u'Daniels, W.'}

其次,通过整数键标识每个文档的作者的列表:

doc_author = [[0, 1, 2], [0], [1, 2]]

创建这些最有效的方法是什么?

仅供参考:我需要这种格式的作者数据来运行用 Python 编写的预先构建的作者主题 LDA 算法。

【问题讨论】:

  • ​​​​​​​​​​​​​​​你已经有author_name字典,或者你也要创建它?
  • 没有。我需要创建它。有什么建议吗?
  • ​​​​​​​​​​​我不确定我是否正确理解了您的问题:您的意思是将authors中最长的列表转换为字典吗?如果是这样,请尝试author_name = dict(enumerate(max(authors, key=len)))
  • 不一定。如果您假设有一个新作者的附加文档,那么该方法就会失效。例如,假设 authors = [[u'Smith, J.', u'Williams, K.', u'Daniels, W.'], [u'Smith, J.'], [u'Williams, K.', u'Daniels, W.'], [u'Johnson, A']]author_name = dict(enumerate(max(authors, key=len)) 没有捕获新作者 u'Johnson, A'
  • ​​​​​​​​​​​​​​呵呵,运行import itertools; author_name = []; for name in itertools.chain(*authors): if name not in author_name: author_name.append(name),然后运行author_name = dict(enumerate(max(author_name, key=len))

标签: python list dictionary token


【解决方案1】:

您需要反转您的author_name 字典;之后,您的列表的转换是微不足道的,使用嵌套列表理解:

author_to_id = {name: id for id, name in author_name.items()}

doc_author = [[author_to_id[name] for name in doc] for doc in authors]

演示:

>>> authors = [[u'Smith, J.', u'Williams, K.', u'Daniels, W.'], [u'Smith, J.'], [u'Williams, K.', u'Daniels, W.']]
>>> author_name = {0: u'Smith, J.', 1: u'Williams, K.', 2: u'Daniels, W.'}
>>> author_to_id = {name: id for id, name in author_name.items()}
>>> [[author_to_id[name] for name in doc] for doc in authors]
[[0, 1, 2], [0], [1, 2]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2021-01-04
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多