tingshuibanxia 发表于 2016-09-10 21:28

新人求教

向各位大神请教一个排序问题!
文本包含3列,tab分隔

A1    X    XX “X1”; XXX "XX1";
A1    Y    YY “YY”; YYY "YYY"; Y_N "1"; E
A1    Y   YY “YY”; YYY "YYY"; Y_N "3"; E
A1    Y    YY “YY”; YYY "YYY"; Y_N "2"; E
A1    Z    ZZ "ZZ"; ZZZ "ZZZ";
A1    X    XX “X2”; XXX "XX2";
A1    Y   YY “YY”; YYY "YYY"; Y_N "3"; E
A1    Z    ZZ "ZZ"; ZZZ "ZZZ";
A1    Y    YY “YY”; YYY "YYY"; Y_N "2"; E
A1    Y    YY “YY”; YYY "YYY"; Y_N "1"; E
A1    Y    YY “YY”; YYY "YYY"; Y_N "4"; E
B1    X    XX “X4”; XXX "XX4";
B1    Z    ZZ "ZZ"; ZZZ "ZZZ";
B1    Y    YY “YY”; YYY "YYY"; Y_N "2"; E
B1    Y    YY “YY”; YYY "YYY"; Y_N "1"; E



我想把第2列按X Z Y 排序,同时Y的几行按照最后的数字进行排序。
每次X第一次出现后,下跟的几行数目不定,到下一个X出现,最后仍按照现在的模式输出如下,还请大神指点!
A1    X    XX “X1”; XXX "XX1";
A1    Z    ZZ "ZZ"; ZZZ "ZZZ";
A1    Y    YY “YY”; YYY "YYY"; Y_N "1"; E
A1    Y    YY “YY”; YYY "YYY"; Y_N "2"; E
A1    Y   YY “YY”; YYY "YYY"; Y_N "3"; E
A1    X    XX “X2”; XXX "XX2";
A1    Z    ZZ "ZZ"; ZZZ "ZZZ";
A1    Y    YY “YY”; YYY "YYY"; Y_N "1"; E
A1    Y    YY “YY”; YYY "YYY"; Y_N "2"; E
A1    Y   YY “YY”; YYY "YYY"; Y_N "3"; E
A1    Y    YY “YY”; YYY "YYY"; Y_N "4"; E
B1    X    XX “X”; XXX "XX";
B1    Z    ZZ "ZZ"; ZZZ "ZZZ";
B1    Y    YY “YY”; YYY "YYY"; Y_N "1"; E
B1    Y    YY “YY”; YYY "YYY"; Y_N "2"; E



haooooaaa 发表于 2016-09-12 11:05

m = {"Y":[], "Z":[]}

def pp(n):
    for j in sorted(n):
      print j
      n.remove(j)

with open("tt") as f:
    for i in f:
      tmp = i.split("\t")
      if tmp == "X":
            if len(m["Y"]):
                pp(m["Z"])
                pp(m["Y"])
            print i.strip()
      else:
            m].append(i.strip())

    pp(m["Z"])
    pp(m["Y"])

zxy877298415 发表于 2016-09-12 11:15

回复 1# tingshuibanxia


a={}
b={}
c=[]
import re
with open('file.txt','r') as f:
        for l in f:
                if re.search(r' +X +',l):
                        a.setdefault(l,[])
                        b.setdefault(l,[])
                        c.append(l)
                        s = l
                elif re.search(r' +Y +',l):
                        a.append(l)
                elif re.search(r' +Z +',l):
                        b.append(l)

for i in sorted(c,key=lambda x:int(re.search(r'(?<=X)\d+',x).group(0))):
        print i,"".join(b),"".join(sorted(a,key=lambda x:int(re.search(r'(?<=\")\d+(?=\")',x).group(0)))),

MMMIX 发表于 2016-09-12 23:44

回复 1# tingshuibanxia

#!/usr/bin/env python3

import sys, re

def file2block(filename):
    with open(filename) as file:
      block = { 'X':None, 'Y':[], 'Z':[] }
      for line in file:
            s = re.search('\t()\t', line).group(1)
            if s == 'X':
                if block['X']:
                  yield block
                  block = { 'X':line, 'Y':[], 'Z':[] }
                else:
                  block['X'] = line
            else:
                block.append(line)

      yield block


def print_block(block):
    print(block['X'], end='')

    for Z in block['Z']:
      print(Z, end='')

    # Schwartzian transform
    # Note: May not be worth it.
    Ys = map(lambda r: r,
             sorted(map(lambda s: , block['Y']),
                  key = lambda r: r))

    for Y in Ys:
      print(Y, end='')


def main():
    for b in file2block(sys.argv):
      print_block(b)

if __name__ == '__main__':
    main()


页: [1]
查看完整版本: 新人求教