【python3】了解set,sort,sorted,for...in...if,list 并排序

1.set方法

set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

2.sort,sorted

sorted() 函数对所有可迭代的对象进行排序操作。

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

3.排序

(1).set+sort

set用于去重,并产生一个dict,用list()强制转为list ,用list的sort方法用原list L的index作为排序的key

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = list(set(L))
>>> T
[1, 2, 3, 4]
>>> T.sort(key=L.index)
>>> T
[3, 1, 2, 4]
 

(2).set+sorted

sorted不需要迭代对象是list,可返回新的list。同样先set,在排序

>>> L = [3, 1, 2, 1, 3, 4]
>>> T = sorted(set(L), key=L.index)
>>> T
[3, 1, 2, 4]

(3).for...in...if

>>> lst1 = [2, 1, 3, 4, 1]
>>> temp = []
>>> [temp.append(i) for i in lst1 if not i in temp]
[None, None, None, None]
>>> print(temp)
[2, 1, 3, 4]

### 使用 Redis Sorted Set 实现分布式锁 #### 设计思路 为了在 Redis 的 `Sorted Set` 中实现分布式锁,可以利用其成员分数(score)来控制锁的持有时间以及唯一性。通过原子操作确保同一时刻只有一个客户端能够成功获得锁。 #### 获取锁的过程 当尝试获取锁时,向指定键名对应的有序集合添加带有当前时间戳作为 score 和唯一标识符作为 member 的新元素: ```java // Java伪代码示例 String lockKey = "my_distributed_lock"; double currentTimestamp = System.currentTimeMillis(); String uniqueClientId = UUID.randomUUID().toString(); Jedis jedis = new Jedis("localhost"); Long result = jedis.zadd(lockKey, currentTimestamp, uniqueClientId); if (result != null && result == 1L) { // 成功插入表示获得了锁 } else { // 插入失败说明已经有其他客户端持有了这把锁 } ``` 此方法依赖于 `ZADD` 命令返回的结果判断是否成功取得锁[^1]。 #### 设置过期时间 为了避免死锁情况发生,在实际应用中还需要设定合理的超时期限,定期更新已持有的锁的有效期限。可以通过 Lua 脚本来完成这一过程以保证整个流程在一个事务内执行完毕。 ```lua -- Lua脚本用于延长锁的时间 local key = KEYS[1] local clientId = ARGV[1] local expireTime = tonumber(ARGV[2]) if redis.call('zscore', key, clientId) then -- 更新该clientID对应项的新得分即新的到期时间 redis.call('zadd', key, 'xx', expireTime, clientId) end return true ``` 这段 Lua 脚本会先检查给定 ID 是否存在于有序集中,如果存在则将其 score 更新为最新的期望释放时间[^3]。 #### 释放锁的操作 要安全地移除不再需要使用的锁,应该再次借助 Lua 来确保即使有多个请求试图同时解锁也能保持一致性。 ```lua -- Lua脚本用于删除锁 local key = KEYS[1] local clientId = ARGV[1] if redis.call('zscore', key, clientId) ~= false then -- 只允许拥有者自己解除自己的锁 redis.call('zrem', key, clientId) else error("Cannot remove a non-existent element or not owned by this client.") end return true ``` 上述逻辑防止了非持有方误删他人所拥有的资源锁定状态[^4]。 #### 处理竞争条件 考虑到网络延迟等因素可能会造成竞态条件问题,因此建议配合 RedLock 算法或其他类似的多节点共识协议进一步增强系统的健壮性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值