论坛首页 入门技术论坛

有个很诡异的需求,向高手请教最优解

浏览 15782 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-10-13  
    clist = ['a','b','b','b','c','c','d']
    def map(clist):
	dic = {}
	zlist = []
	for i in clist:
		dic[i] = clist.count(i)
	for key,value in dic.items():
		if value == 1:
			zlist.append(key)
		else:
			zlist.append(key + '*' + str(value))
	return zlist
    ';'.join(map(clist))


来个python的,哈哈
0 请登录后投票
   发表时间:2006-10-14  
遍历List,可以用Iterator,可以很方便地遍历,
用.equals进行对象比较就行了,相等则计数
0 请登录后投票
   发表时间:2006-10-14  
有点像压缩。
0 请登录后投票
   发表时间:2006-10-15  
Ruby的呼呼: (交互模式, >>代表输入命令,=>代表输出)
>>clist = %w{a b b b c c d}  
=>["a", "b", "b", "b", "c", "c", "d"] 

>>temp = {}
>>clist.each{|i| temp[i].nil? ? temp[i] = 1 : temp[i] +=1} 
>>temp
=>{"a"=>1, "b"=>3, "c"=>2, "d"=>1}  

>>temp.map{|k,v| v == 1 ? k : k + v.to_s}.join ';'   
=>"a;b3;c2;d" 
            
写成一个函数的话:
def count(list)
  temp = {}    
  list.each{|i| temp[i].nil? ? temp[i] = 1 : temp[i] +=1}          
  temp.map{|k,v| v == 1 ? k : k + v.to_s}.join ';'
end 
 
0 请登录后投票
   发表时间:2006-10-15  
可惜python不支持问号表达式,否则可以写成一行
import re

def maketimes(w, s, u):
    if u:
        return '%s*%d' % (w, len(s)/len(u)+1)
    return w

def parselist(str):
    return ';'.join([maketimes(w,s,u) for w,s,u in re.findall(r'(\w+)((,\1)*)', str)])

if __name__ == '__main__':
    print parselist('a,b,b,b,c,c,d')


另外,如果list里面是object的话,假设是通过其toString来比较是否相同,那么
if __name__ == '__main__':
    l = ['a', 'b', 'b', 'b', 'c', 'c', 'd']
    print parselist(','.join(map(str, l)))
0 请登录后投票
   发表时间:2006-12-25  
javascript 风格:

var a=["a","b","b","b","c","c","d"];
var b={};
for(var c in a)
{	if(b[a[c]]) b[a[c]]++;else b[a[c]]=1;
}
var e="";
for(var d in b)
{	e+=d+(b[d]>1?("*"+b[d]):"")+";";
}
alert(e);
0 请登录后投票
   发表时间:2006-12-26  
相当于一个最简单的压缩算法,没什么意思。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics