在返回整个序列

时间:2017-06-28 15:09:39

标签: python

我希望通过截断除最后一部分之外的所有内容来缩短python类名,即:module.path.to.Class => mo.pa.to.Class

这可以通过拆分字符串并将列表存储在变量中然后对除最后一部分之外的所有部分进行操作并将它们连接起来来实现。

我想知道是否有办法一步完成,即:

  • 拆分为零件
  • 创建两个序列副本(tee?)
  • 将截断应用于一个序列而不是其他
  • 加入序列的选定部分

类似的东西:

'.'.join( [chain(map(lambda x: x[:2], foo[:-1]), bar[-1]) for foo, bar in tee(name.split('.'))] )

但我无法理解使用...foo, bar in tee(...

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式在一行中完成此操作:

connect()

模式>>> re.sub(r'(\b\w{2})\w*(\.)', r'\1\2', 'module.path.to.Class') 'mo.pa.to.Class' 捕获了两个匹配项:一个单词的前两个字母和单词末尾的点。

替换模式r'(\b\w{2})\w*(\.)'将两个捕获的组连接在一起-单词的前两个字母和点。

没有将r'\1\2'参数传递给count,因此将替换所有出现的模式。

最后一个词-类名-不会被截断,因为它没有点号,因此它与模式不匹配。

答案 1 :(得分:0)

如果要拆分,可以先在最后一个点上拆分一次,然后再将其拆分以获取包索引,然后仅将其缩短到前两个字符,最后只对第一部分进行处理最后将所有内容重新组合在一起。如果您坚持要内联:

name = "module.path.to.Class"
short = ".".join([[x[:2] for x in p.split(".")] + [n] for p, n in [name.rsplit(".", 1)]][0])
print(short)   # mo.pa.to.Class

这会创建不必要的列表,以使其可以安全地遍历列表理解水域,实际上,它可能会比以常规的程序方式处理它慢得多:

def shorten_path(source):
    indices = source.split(".")
    return ".".join(x[:2] for x in indices[:-1]) + "." + indices[-1]

name = "module.path.to.Class"
print(shorten_path(name))  # mo.pa.to.Class