Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python筛选:仅保留最新的Python MacPort_Python_Vim - Fatal编程技术网

Python筛选:仅保留最新的Python MacPort

Python筛选:仅保留最新的Python MacPort,python,vim,Python,Vim,我在Vim中打开了一个文件: py24-sqlalchemy py25-beautifulsoup py25-beautifulsoup4 py25-bpython py25-epydoc py25-icalendar py25-ipython py25-libgmail py25-mechanize py25-numpy py25-pil py25-simplejson py25-sphinx py25-sqlalchemy py25-sqlite py25-tkinter py25-vobj

我在Vim中打开了一个文件:

py24-sqlalchemy
py25-beautifulsoup
py25-beautifulsoup4
py25-bpython
py25-epydoc
py25-icalendar
py25-ipython
py25-libgmail
py25-mechanize
py25-numpy
py25-pil
py25-simplejson
py25-sphinx
py25-sqlalchemy
py25-sqlite
py25-tkinter
py25-vobject
py26-appscript
py26-beautifulsoup
py26-bpython
py26-epydoc
py26-game
py26-icalendar
py26-ipython
py26-mechanize
py26-numpy
py26-pdfminer
py26-simplejson
py26-sphinx
py26-sqlalchemy
py26-sqlite
py26-tkinter
py26-vobject
py27-appscript
py27-asciitable
py27-asciitable
py27-beautifulsoup
py27-beautifulsoup4
py27-blist
py27-bpython
py27-chm
py27-configobj
py27-dateutil
py27-epydoc
py27-game
py27-gdal
py27-gtk
py27-ipython
py27-lxml
py27-matplotlib
py27-mechanize
py27-mysql
py27-numpy
py27-pdfminer
py27-pil
py27-prettytable
py27-progressbar
py27-psutil
py27-py2app
py27-pylint
py27-pyobjc
py27-pyobjc-cocoa
py27-pypdf
py27-pyqt4
py27-simplejson
py27-sphinx
py27-sqlalchemy
py27-sqlite
py27-termcolor
py27-tkinter
py27-tz
py27-wxpython
py31-appscript
py31-asciitable
py31-beautifulsoup4
py31-blist
py31-bpython
py31-game
py31-lxml
py31-psutil
py32-asciitable
py32-beautifulsoup4
py32-blist
py32-bpython
py32-game
py32-ipython
py32-lxml
py32-psutil
# ... etc ... (many lines)
我想过滤行,以便对于2.x范围内的Python版本,我只保留最新的包

示例:如果文件同时包含py25-ipython和py26-ipython,我希望py25-ipython消失,而py26-ipython保留。始终仅保留最新版本,并且每个软件包仅保留一个版本

这是我想出来的,但它的编码很糟糕。在我看来,几乎是C64-BASIC代码

#!/usr/bin/env python2.7
import sys
import re

PATTERN_PYTHON_MACPORT = '^py(2[4567])-(\w[-\w]*)$'
REGEX_PYTHON_MACPORT = re.compile(PATTERN_PYTHON_MACPORT)

def main():
  packages = {}
  filtered_lines = []
  for line in sys.stdin:
    match = REGEX_PYTHON_MACPORT.match(line)
    if match:
      python_version = int(match.group(1))
      package_name = match.group(2)
      if package_name in packages:
        packages[package_name].append(python_version)
      else:
        packages[package_name] = [python_version]
    else:
      filtered_lines.append(line)
  for package_name in packages:
    versions = packages[package_name]
    if len(versions) == 1:
      version_to_keep = versions[0]
    else:
      version_to_keep = sorted(versions, reverse=True)[0]
      filtered_lines.append('py{}-{}\n'.format(version_to_keep,
                                               package_name))
  for line in sorted(filtered_lines):
    sys.stdout.write(line)
if __name__ == '__main__':
  main()
我怎样才能让它更像蟒蛇?这在Vimscript中更容易实现吗?我可能更喜欢Vimscript中的解决方案

顺便说一下,我是Python和Vimscript的初学者。在这里学习。代码示例将非常好

PS我使用
:'从Vim内部运行过滤器,这将执行相同的操作(假设您的输入列表已排序)。否则,使用
排序(sys.stdin)
。如果您不想保留Python3.x模块,请删除'else'子句

import re
rex = re.compile('py2\d+-(\S+)')
modules = {}
for line in sys.stdin:
    match = rex.match(line)
    if match:
        modules[match.group(1)] = match.group(0)
    else:
        modules[line] = line
print '\n'.join(sorted(modules.values()))
输出:

py25-libgmail
py26-icalendar
py26-vobject
py27-appscript
py27-asciitable
py27-beautifulsoup
py27-beautifulsoup4
py27-blist
py27-bpython
py27-chm
py27-configobj
py27-dateutil
py27-epydoc
py27-game
py27-gdal
py27-gtk
py27-ipython
py27-lxml
py27-matplotlib
py27-mechanize
py27-mysql
py27-numpy
py27-pdfminer
py27-pil
py27-prettytable
py27-progressbar
py27-psutil
py27-py2app
py27-pylint
py27-pyobjc
py27-pyobjc-cocoa
py27-pypdf
py27-pyqt4
py27-simplejson
py27-sphinx
py27-sqlalchemy
py27-sqlite
py27-termcolor
py27-tkinter
py27-tz
py27-wxpython
py31-appscript
py31-asciitable
py31-beautifulsoup4
py31-blist
py31-bpython
py31-game
py31-lxml
py31-psutil
py32-asciitable
py32-beautifulsoup4
py32-blist
py32-bpython
py32-game
py32-ipython
py32-lxml
py32-psutil

哇,太紧凑了!因此,如果我理解正确的话,在扫描具有“最高”版本的行时,您正在使用stdin-being-sorted属性将dict中的唯一值替换为完整的包名。这显然意味着也要过滤掉py3.x版本。。我喜欢
\S
而不是\w“+”-,这是一件值得学习的事情。是的,没错。Python3.x由正则表达式过滤掉。这就是为什么我在循环中添加了'else'子句(如果您想保留它们)。如果不这样做,请删除'else'子句,输出将只有Python2.x包。还有什么概念上的错误吗?不完全是。您可以通过使用:
packages=defaultdict(list)
然后使用
packages[package\u name].append(python\u version)来避免类似于
if-package\u-name in-packages:packages[package\u-name].append(python\u-version)else:packages[package\u-name]=[python\u-version]
的模式。这是一个多么奇妙的发现,谢谢接受答案,鞠躬致谢<代码>m(Um)