我有一个格式为{'ip1:port1' : <value>, 'ip1:port2' : <value>, 'ip2:port1' : <value>, ...}
的python字典。字典键是由ip:port对组成的字符串。值对于此任务不重要。
我需要一个具有唯一IP地址的ip:port
组合的列表,端口可以是原始密钥中出现的任何端口。例如,可以接受两个变体:['ip1:port1', ip2:port1']
和{
最像Python的方式是什么?
目前我的解决方案是
def get_uniq_worker_ips(workers):
wip = set(w.split(':')[0] for w in workers.iterkeys())
return [[worker for worker in workers.iterkeys() if worker.startswith(w)][0] for w in wip]
我不喜欢它,因为它会创建额外的列表,然后丢弃它们。
您可以使用^{} 按相同的IP地址分组:
从不同的组中选择一个IP。在
^{pr2}$或者更短,为组中的第一个键生成生成器表达式:
但是,请注意,
groupby
需要对输入数据进行排序。因此,如果您想避免对dict中的所有键进行排序,那么您应该只使用一个set
已经看到的键。在这与您的解决方案类似,但不是循环唯一的键并在dict中为每个键找到匹配的键,而是循环键并检查是否已经看到了IP。在
在我的解决方案中,我改变了几个字符,现在对它很满意。在
感谢@Ignacio Vazquez Abrams和@M.T.的解释。在
一种方法是将密钥转换为自定义类,该类在执行相等测试时只查看字符串的IP部分。它还需要提供适当的
__hash__
方法。在这里的逻辑是
set
构造函数将“看到”具有相同IP的密钥,而忽略比较中的端口部分,因此如果集合中已经存在具有该IP的密钥,则它将避免向集合添加密钥。在下面是一些在Python2或Python3上运行的代码。在
输出
^{pr2}$如果运行的是Python2.7或更高版本,则函数可以使用集合理解,而不是
set()
构造函数调用中的生成器表达式。在严格来说,
IPKey.__repr__
方法不是必需的,但是我喜欢给我所有的类一个__repr__
,因为它在开发过程中很方便。在这是一个非常有效的更简洁的解决方案,由Jon Clements提供。它通过字典理解构建所需的列表。在
相关问题 更多 >
编程相关推荐