题解 | #数据分类处理#
数据分类处理
http://www.nowcoder.com/practice/9a763ed59c7243bd8ab706b2da52b7fd
我觉得这题的难点在于怎么把含R[i]的I[j]按它们原本在I中的顺序输出
我想到的办法是用list.index()方法,找到位置以后把这个位置设置成null,这样下次同一元素查位置的时候找到的就是下一个该元素的位置了
import re
while 1:
try:
I = input()
R = input()
lst_I = I.split(" ")[1:]#输入字符串的第一位多少整数其实没有用,这里可以直接删了
lst_R = sorted(map(int,list(set(R.split(" ")[1:]))))#这里的排序必须要按int排,按str排会出问题
I = I[len(I.split(" ")[0])+1:]
R = R[len(R.split(" ")[0])+1:]
lst_place=[]
for i in lst_R:
find = '[0-9]*'+'%d'%i+'[0-9]*'
b = re.findall(find,I)#b返回的是所有包含R[i]的列表,而且是按顺序排的
lst_I = I.split(" ")#进行下一轮查找R[i]所包含的值前,需要将前一轮替换的null抹掉
if len(b) != 0:
lst_place.append('%d'%i+' '+str(len(b)))#将R[i]及其个数放在这一段的开头
for item in b:
place = lst_I.index(item)#找到包含R[i]的元素item的位置
lst_I[place] = 'null'#将该位置替换为null,这样下次有相同值的item就不会找到当前位置了
lst_place.append(str(place)+' '+item)#将位置和item加入列表
a=''
for i in lst_place:
a = a+' '+i
print(str(len(lst_place)*2)+a)#因为list place里的整数都是成对出现的,所以*2
except:
break