id是否相同是啥意思python_将唯一ID分配给python中的列表列表,其中重复项获得相同的id...

使用关联的ID保留已经看到的元素的映射.

from itertools import count

from collections import defaultdict

mapping = defaultdict(count().__next__)

result = []

for element in my_list:

result.append(mapping[tuple(element)])

你也可以使用列表理解:

result = [mapping[tuple(element)] for element in my_list]

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

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

defaultdict将在找不到密钥时分配默认值.通过调用构造函数中提供的函数获取默认值.

在这种情况下,count()生成器的__next__方法会产生越来越多的数字.

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

from functools import partial

mapping = 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 defaultdict

In [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 randint

In [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 loop

In [7]: %timeit indexing(seq)

1 loop,best of 3: 26 s per loop

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值