|
发表于 2017-6-2 22:03:08
|
显示全部楼层
- def decode_bits_advanced(bits):
- bits = bits.strip("0") #去除首尾无效的0
- ones_list = bits.split('0') #将所有的1放入列表
- ones_len = 0
- length1 = len(ones_list)
-
-
- while ones_len != length1: ##这个地方是因为执行一次for循环无法去除所有的''
- length1 = len(ones_list) ##需要多次执行for循环才能全部去除,不知道是什么原因
- for each in ones_list: ##希望大神帮忙指点一下
- if each == '':
- ones_list.remove(each)
- ones_len = len(ones_list)
- zeroes_list = bits.split('1') #将所有的0的组合放入列表
- zero_len =0
- length0 = len(zeroes_list)
- while zero_len != length0: ##原因同上
- length0 = len(zeroes_list)
-
- for each in zeroes_list:
-
- if each == '':
- zeroes_list.remove(each)
- zero_len = len(zeroes_list)
- ##此处开始为K-means算法,对于所有的1的组合,k取2,两个之心分别取2,6
- ##通过多次执行后返回dot和dash的列表
- bit_centroid1 = 2
- bit_centroid2 = 6
- new_bit_cen1 = 0.0
- new_bit_cen2 = 0.0
- while True:
- dots = []
- dash = []
- for each in ones_list:
- if abs(len(each) - bit_centroid1) <= abs(len(each)-bit_centroid2):
- dots.append(each)
- else:
- dash.append(each)
- dots_sum = 0
- for each in dots:
- dots_sum += len(each)
-
- new_bit_cen1 = dots_sum/len(dots)
- dash_sum = 0
- for each in dash:
- dash_sum += len(each)
- new_bit_cen2 = dash_sum/len(dash)
- if (new_bit_cen1 == bit_centroid1) and (new_bit_cen2 == bit_centroid2):
- break
- else:
- bit_centroid1 = new_bit_cen1
- bit_centroid2 = new_bit_cen2
- ##将dot和dash列表中的组合替换为'.'和'-',这里要注意的是要先将长的组合进行替换
- ##所以要进行组合由长到短的排序,否则,结果会出现全是'.'或出现多余的','和'-'的情况
- for each_dash in sorted(dash,reverse = True):
- bits = bits.replace(each_dash,'-')
- for each_dot in sorted(dots,reverse = True):
- bits = bits.replace(each_dot,'.')
-
- ##这里进行0的组合的K-means算法,k取3,质心分别取2,6,14,代表字符内的空格
- ##字符间的空格和单词之间的空格
- space_cen1 = 2
- space_cen2 = 6
- space_cen3 = 14
- new_space_cen1 = 0.0
- new_space_cen2 = 0.0
- new_space_cen3 = 0.0
- while True:
- within_char = []
- between_chars = []
- between_words = []
- for each in zeroes_list:
- distance1 = abs(len(each) - space_cen1)
- distance2 = abs(len(each) - space_cen2)
- distance3 = abs(len(each) - space_cen3)
- if min(distance1,distance2,distance3) == distance1:
- within_char.append(each)
- elif min(distance1,distance2,distance3) == distance2:
- between_chars.append(each)
-
- else:
- between_words.append(each)
- sum1 = 0
- for each in within_char:
- sum1 += len(each)
-
- new_space_cen1 = sum1/len(within_char)
- sum2 = 0
- for each in between_chars:
- sum2 += len(each)
-
- new_space_cen2 = sum2/len(between_chars)
-
- sum3 = 0
- for each in between_words:
- sum3 += len(each)
-
- new_space_cen3 = sum3/len(between_words)
- if (new_space_cen1 == space_cen1) and (new_space_cen2 == space_cen2)\
- and (new_space_cen3 == space_cen3):
- break
- else:
- space_cen1 = new_space_cen1
- space_cen2 = new_space_cen2
- space_cen3 = new_space_cen3
-
- ##此处与上面"1"的时候一样
- for each_zero in sorted(between_words,reverse = True):
- bits = bits.replace(each_zero,' ')
- for each_zero in sorted(between_chars,reverse = True):
- bits = bits.replace(each_zero,' ')
-
- for each_zero in sorted(within_char,reverse = True):
- bits = bits.replace(each_zero,'')
-
- return bits
- ##第一次接触K-means算法,写的有点啰嗦,但是可以运行出正确的结果
- ##希望论坛里的大神不吝指教,共同进步
- ##解码的是直接论坛里copy过来的,自己写的在另一台电脑上,懒得再写一遍了
- def decodemorse(morseCode):
- MORSE_CODE = {'.-...': '&', '--..--': ',', '....-': '4', '.....': '5',\
- '...---...': 'SOS', '-...': 'B', '-..-': 'X', '.-.': 'R', \
- '.--': 'W', '..---': '2', '.-': 'A', '..': 'I', '..-.': 'F', \
- '.': 'E', '.-..': 'L', '...': 'S', '..-': 'U', '..--..': '?',\
- '.----': '1', '-.-': 'K', '-..': 'D', '-....': '6', '-...-': '=',\
- '---': 'O', '.--.': 'P', '.-.-.-': '.', '--': 'M', '-.': 'N', \
- '....': 'H', '.----.': "'", '...-': 'V', '--...': '7',\
- '-.-.-.': ';', '-....-': '-', '..--.-': '_', '-.--.-': ')',\
- '-.-.--': '!', '--.': 'G', '--.-': 'Q', '--..': 'Z', '-..-.': '/', \
- '.-.-.': '+', '-.-.': 'C', '---...': ':', '-.--': 'Y', '-': 'T', \
- '.--.-.': '@', '...-..-': ', '.---': 'J', '-----': '0', '----.': '9', \
- '.-..-.': '"', '-.--.': '(', '---..': '8', '...--': '3'}
- return ' '.join(''.join(MORSE_CODE[letter] for letter in word.split(' ')) for word in morseCode.strip().split(' '))
-
-
复制代码 |
评分
-
查看全部评分
|