新人求教
向各位大神请教一个排序问题!文本包含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
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"]) 回复 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)))),
回复 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]