一种实现方法是将您的键转换为一个自定义类,该类在进行相等性测试时仅查看字符串的IP部分。它还需要提供一个合适的__hash__
方法。
这里的逻辑是,set
构造函数将 "看到" 具有相同 IP 的键视为相同,忽略比较中的端口部分,因此如果集合中已经存在具有该 IP 的键,则它将避免将该键添加到集合中。
下面是在Python 2或Python 3上运行的一些代码。
class IPKey(object):
def __init__(self, s):
self.key = s
self.ip, self.port = s.split(':', 1)
def __eq__(self, other):
return self.ip == other.ip
def __hash__(self):
return hash(self.ip)
def __repr__(self):
return 'IPKey({}:{})'.format(self.ip, self.port)
def get_uniq_worker_ips(workers):
return [k.key for k in set(IPKey(k) for k in workers)]
workers = {
'ip1:port1' : "val",
'ip1:port2' : "val",
'ip2:port1' : "val",
'ip2:port2' : "val",
}
print(get_uniq_worker_ips(workers))
输出
['ip2:port1', 'ip1:port1']
如果您正在运行Python 2.7或更高版本,则该函数可以使用一个集合推导式来替换在
set()
构造函数调用内部的生成器表达式。
def get_uniq_worker_ips(workers):
return [k.key for k in {IPKey(k) for k in workers}]
IPKey.__repr__
方法并非必需,但我喜欢为所有的类编写 __repr__
方法,因为在开发过程中可能会很方便。
以下是一个更加简洁且高效的解决方案,由 Jon Clements 提供。它通过字典推导式构建所需列表。
def get_uniq_worker_ips(workers):
return list({k.partition(':')[0]:k for k in workers}.values())
[]
更改为圆括号()
来完成。 - M.T