【问题标题】:Tokenise list of integers in python在python中标记整数列表
【发布时间】:2016-06-01 15:38:08
【问题描述】:

抱歉这个菜鸟问题,但我才刚刚开始使用 Python。

我有一个很长的列表,包含 195 个不同的整数,但它们的范围从 0 到 2399。例如,数字 90 出现多次,而数字 7 根本不出现。

list = [90, 110, 113, 88, 90, 110, 90, 1370, 90]

我想对此进行“标记化”,或将其转换为范围从 0 到 195 的整数列表,同时保留不同值的唯一 ID。 基本上,我想要这个输出:

new_list = [1, 2, 3, 4, 1, 2, 1, 5, 1]

目标是能够有效地迭代列表。

【问题讨论】:

  • 高效地遍历列表???一个数字就是一个数字。迭代更大的数字不会改变任何事情
  • 我真的不知道你为什么想要这个,但你可能想要使用哈希。整数 (90, 110 ...) 是关键。值是 id。当你第一次找到一个数字时,你增加一个计数器并将它存储在散列和新列表中。下次你找到一个数字时,你使用哈希中的 id。
  • 我的两分钱,通常当我听到“非常长的清单”时,我认为是“万亿”,而不是糖果的价格。
  • 问题是我不知道这 195 个整数到底是什么,我需要在完整的 (200.000) 列表中搜索它们。将它们从 0 到 2399 之间的随机分布减少到 0-195 使其更容易。哈希解决方案听起来很不错,而且很可能是一种更“正确”的方法。但是,Joran 提出的解决方案解决了我的问题,这是一个一次性使用脚本(目前)。完整列表刚刚超过 200.000,问题是我必须基于它创建单位矩阵。将复杂性从 2399 个不同的步骤减少到 195 个是巨大的性能提升。

标签: python list collapse


【解决方案1】:
d={}
new_list = [d[i] for i in values if d.setdefault(i,len(d)+1)]

【讨论】:

  • 谢谢!完全按照需要工作:)
【解决方案2】:

作为@cricket_007,我质疑您的申请。迭代不随数字的大小而变化。但是,如果您有理由需要一组密集的 ID,那么这是一种可能的解决方案。我让构建循环变得简单,让您了解它是如何工作的;您可以进行一些 Pythonic 改进,例如使用字典 get 方法。

构建字典以将旧 ID 转换为新 ID。 然后一举搞定。

my_list = [90, 110, 113, 88, 90, 110, 90, 1370, 90]

new_id_dict = {}
new_id = 0

for id in my_list:
    if id not in new_id_dict:
        new_id += 1
        new_id_dict[id] = new_id

new_list = [new_id_dict[id] for id in my_list]
print new_list

输出:

[1, 2, 3, 4, 1, 2, 1, 5, 1]

【讨论】:

  • 哈! @Joran 在我添加关于改进的评论时做了一个可爱的简约版本。
  • 在答案中使用 @ 并没有真正做任何事情,AFAIK
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2010-12-26
  • 1970-01-01
相关资源
最近更新 更多