这样做的一种方法是将您的密钥转换为自定义类,该类只在进行相等性测试时查看字符串的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)]
# Test
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())
然后使用genexs代替。 –
对不起,你能更具体吗? – wl2776
by“genexs”,我认为他的意思是“生成器表达式”,这意味着你创建一个生成器而不是一个列表。这可以通过在列表理解中用方括号'()'改变方括号'[]'来完成。 –