将唯一ID分配给python中的列表列表,其中重复项获得相同的id

将唯一ID分配给python中的列表列表,其中重复项获得相同的id,第1张

概述我有一个列表列表(最多可包含90k个元素) [[1,2,3], [1,2,4], [1,2,3], [1,2,4], [1,2,5]] 我想为每个元素分配一个id,其中id是唯一的,除非项目是重复的.所以对于上面的列表,我需要这个: [0,1,0,1,2] 这样做最有效的方法是什么? 使用关联的ID保留已经看到的元素的映射. from itertools import countfrom col 我有一个列表列表(最多可包含90k个元素)
[[1,2,3],[1,4],5]]

我想为每个元素分配一个ID,其中ID是唯一的,除非项目是重复的.所以对于上面的列表,我需要这个:

[0,1,2]

这样做最有效的方法是什么?

解决方法 使用关联的ID保留已经看到的元素的映射.
from itertools import countfrom collections import defaultdictmapPing = defaultdict(count().__next__)result = []for element in my_List:    result.append(mapPing[tuple(element)])

你也可以使用列表理解:

result = [mapPing[tuple(element)] for element in my_List]

不幸的是,列表不可清除,因此在将它们存储为映射的键时必须将它们转换为元组.

注意使用defaultdictcount().__next__提供独特增加ID的技巧.在python2上,你必须用.next替换.__ next__.

defaultdict将在找不到密钥时分配默认值.通过调用构造函数中提供的函数获取默认值.
在这种情况下,count()生成器的__next__方法会产生越来越多的数字.

作为一种更便携的替代方案,您可以:

from functools import partialmapPing = defaultdict(partial(next,count()))

如评论中所提出的另一种解决方案是将索引用作唯一ID:

result = [my_List.index(el) for el in my_List]

但这是实现:

>需要O(N ^ 2)时间而不是O(N)
> ID是唯一的,增加但不连续(可能是也可能不是问题)

有关两种解决方案的比较,请参阅:

In [1]: from itertools import count   ...: from collections import defaultdictIn [2]: def hashing(seq):   ...:         mapPing = defaultdict(count().__next__)   ...:         return [mapPing[tuple(el)] for el in seq]   ...: In [3]: def indexing(seq):   ...:    return [seq.index(i) for i in seq]   ...: In [4]: from random import randintIn [5]: seq = [[randint(1,20),randint(1,20)] for _ in range(90000)]In [6]: %timeit hashing(seq)10 loops,best of 3: 37.7 ms per loopIn [7]: %timeit indexing(seq)1 loop,best of 3: 26 s per loop

请注意,对于90k元素列表,映射解决方案需要的时间少于40毫秒,而索引解决方案需要26秒.

总结

以上是内存溢出为你收集整理的将唯一ID分配给python中的列表列表,其中重复项获得相同的id全部内容,希望文章能够帮你解决将唯一ID分配给python中的列表列表,其中重复项获得相同的id所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存