<p>一种方法是将密钥转换为自定义类,该类在执行相等测试时只查看字符串的IP部分。它还需要提供适当的<code>__hash__</code>方法。在</p>
<p>这里的逻辑是<code>set</code>构造函数将“看到”具有相同IP的密钥,而忽略比较中的端口部分,因此如果集合中已经存在具有该IP的密钥,则它将避免向集合添加密钥。在</p>
<p>下面是一些在Python2或Python3上运行的代码。在</p>
<pre><code>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))
</code></pre>
<p><strong>输出</strong></p>
^{pr2}$
<p>如果运行的是Python2.7或更高版本,则函数可以使用集合理解,而不是<code>set()</code>构造函数调用中的生成器表达式。在</p>
<pre><code>def get_uniq_worker_ips(workers):
return [k.key for k in {IPKey(k) for k in workers}]
</code></pre>
<p>严格来说,<code>IPKey.__repr__</code>方法不是必需的,但是我喜欢给我所有的类一个<code>__repr__</code>,因为它在开发过程中很方便。在</p>
<hr/>
<p>这是一个非常有效的更简洁的解决方案,由<a href="https://stackoverflow.com/users/1252759/jon-clements">Jon Clements</a>提供。它通过字典理解构建所需的列表。在</p>
<pre><code>def get_uniq_worker_ips(workers):
return list({k.partition(':')[0]:k for k in workers}.values())
</code></pre>