【发布时间】:2013-11-27 10:42:48
【问题描述】:
说明:
我编写了以下函数来缩短生产中使用的机器的主机名。此处的名称已更改,但保留了相同的结构和格式。下面的代码很笨拙,我想将代码设为DRY (Don't Repeat Yourself)。可读性也很重要,因为这些代码可能不仅需要我自己维护或理解。
代码:
def shorten_hostnames(machines):
# split items
d = {k: v.split('.') for k, v in machines.items()}
# trim end
while all(d.values()):
if not len(set([v[-1] for v in d.values()])) == 1:
break
if not all(len(v) > 1 for v in d.values()):
break
d = {k: v[:-1] for k, v in d.items()}
# trim start
while all(d.values()):
if not len(set([v[0] for v in d.values()])) == 1:
break
if not all(len(v) > 1 for v in d.values()):
break
d = {k: v[1:] for k, v in d.items()}
# join items
d = {k: '.'.join(v) for k, v in d.items()}
# return shortened hostnames
return d
示例输入:
machines = {'a.ace.site.info': 'a.ace.site.info',
'b.ace.site.info': 'b.ace.site.info',
'a.bob.site.info': 'a.bob.site.info',
'b.bob.site.info': 'b.bob.site.info',}
输出:
>>> for k, v in shorten_hostnames(machines).items():
print k, '-->', v
b.ace.site.info --> b.ace
a.ace.site.info --> a.ace
b.bob.site.info --> b.bob
a.bob.site.info --> a.bob
我在哪里以及为什么需要您的帮助:
我试图嵌入一个函数,该函数将根据提供的参数从任一端进行修剪,但我不知道如何修改切片符号以从列表的开头或结尾进行修剪。我确信有一个我忽略的简单解决方案,无论是切片符号还是其他东西。
陷阱:
这里有几件事情需要提到,也就是你所说的“陷阱”。如果只有一个主机名被传递到函数中(例如machines = {'a.ace.site.info': 'a.ace.site.info'}),它应该只返回第一部分(在示例a 中)。另外 - 最终答案中不应有重复的结果。另外 - 主机名可以有不同的长度(段数不同)
事后思考:
一旦找到合适的解决方案,我将编辑问题标题和标签,以更好地反映如何将其应用于网站的未来访问者。例如,如果切片符号是解决方案(并且可以动态应用),我可能会修改问题以反映动态切片符号是问题的主题。
更多样本输入和预期输出:
# In
machines = {'ace.a.site.info': 'ace.a.site.info',
'ace.b.site.info': 'ace.b.site.info',}
# Out
ace.b.site.info --> b
ace.a.site.info --> a
# In
machines = {'a.ace.site.info': 'a.ace.site.info',}
# Out
a.ace.site.info --> a
# In
machines = {'ace.a.site.info': 'ace.a.site.info',
'ace.b.site.com': 'ace.b.site.com',}
# Out
ace.b.site.com --> b.site.com
ace.a.site.info --> a.site.info
【问题讨论】:
-
您的意思是要从字符串列表中删除常见的前缀和后缀?
-
顺便说一句,您的示例代码似乎产生了
AttributeError: 'NoneType' object has no attribute 'items' -
@MartijnPieters 是的。这就是我从示例中所理解的......
-
@MartijnPieters 试试这个,这应该会重现它pastebin.com/Lr9QZFxn
-
所有主机名的长度是否相等;例如它们都有相同数量的点吗?
标签: python python-2.7 dry