问题描述与方案设计
接到一个需求可以建模成下面这样:有一堆水果,有苹果、梨、火龙果等等。需要根据不同的水果来输出不同的标语。例如对苹果输出“xx苹果,好懂我的健康哦!”;对梨输出“不梨不弃”;对火龙果输出“风风火火都是我”。 但是苹果也有各种不同的子品种,如有红富士、红将军、金冠等等。对于红富士苹果,输出具体为“红富士苹果,好懂我的健康哦!”;对于金冠,输出具体为“金冠苹果,好懂我的健康哦!”。
现在指定在这些水果按照以下顺序排列:红富士苹果、红将军苹果、金冠苹果、梨、火龙果。 对应的标语为:
["红富士苹果,好懂我的健康哦!", "红将军苹果,好懂我的健康哦!", "金冠苹果,好懂我的健康哦!", "不梨不弃", "风风火火都是我"]
给定一个状态列表,指定对每个位置上的水果的标语的状态或参数。如
["红富士", "", "", True, False]
如果某个位置上是一个非空字符串(空字符串作为一个占位符),那么该字符作为该位置上对应水果的状态或者说一个参数。例如对于第0号位置,如果该位置上对应的是非空字符串,如这里的红富士,就用这个字符串替换苹果的标语中的xx,将标语修改为“红富士苹果,好懂我的健康哦!”;如果是空字符串就输出作为占位符的空字符串串。对3号位置上来说,如果为True就输出梨的标语“不梨不弃”,如果是False就输出空字符串。
那么最终输出一个列表:
["红富士苹果,好懂我的健康哦!", "", "", "不梨不弃", ""]
使用一个指定分隔符(如#)将这个列表拼接起来,输出为:
'红富士苹果,好懂我的健康哦!###不梨不弃#'
此外,在最终输出的字符串中可能还要加上一个引导语,如“有趣的水果标语们”,使用一个指定的分隔符(这里使用=>)分割引导语和水果的标语,于是这个字符串变成了:
'有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#'
现在给定很多个这样的字符串,需要统计每类水果标语出现在所有数据中出现的总次数。苹果要按大类算,即不区分红富士、红将军和金冠,都算作苹果。
例如,如果多个字符串如下所示。
fruits = ['红富士苹果,好懂我的健康哦!###不梨不弃#', '#红将军苹果,好懂我的健康哦!##不梨不弃#我是这条街上最靓的水果', '##金冠苹果,好懂我的健康哦##风风火火都是我', '红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!##不梨不弃#']
那么统计结果也如下:
stat = {"苹果,好懂我的健康哦!": 4, "不梨不弃": 3, "风风火火都是我": 2}
那么如果要增加一个新的水果,例如,增加草莓,它的输出为“酸酸甜甜就是我”。那么排列顺序修改为: 红富士苹果、红将军苹果、金冠苹果、梨、火龙果、草莓。标语的列表变为
["红富士苹果,好懂我的健康哦!", "红将军苹果,好懂我的健康哦!", "金冠苹果,好懂我的健康哦!", "不梨不弃", "风风火火都是我", "酸酸甜甜就是我"]
现指定状态列表为:
["红富士", "红将军", "", True, False, True]
输出列表变为:
["红富士苹果,好懂我的健康哦!", "红将军苹果,好懂我的健康哦!", "", "不梨不弃", "", "酸酸甜甜就是我"]
最终输出的字符串变为:
"红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!##不梨不弃##酸酸甜甜就是我"
实现思路与代码
UML图如下。其中FruitSlogan为父类,表示水果标语,有一个子类AppleSlogan,该类与其父类的不同在于,它的get_slogan方法与父类的实在有些不同。
类FruitSloganManager负责生成水果标语短句和反向解析水果标语短句并进行统计。有两个重要的方法,一个是create_slogan,这个方法根据状态列表生成水果标语短句;另一个是parse_slogan_and_statistic,反向解析水果标语短句并进行统计。

完整代码如下:
import re
import json
class FruitSlogan(object):
def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
self.fruit = fruit
self.fruit_slogan = fruit_slogan
self.fruit_keyword = fruit_keyword
self.place_holder = place_holder
def get_slogan(self, status_phrase):
return self.fruit_slogan if status_phrase else self.place_holder
def get_keyword(self):
return self.fruit_keyword
def is_status_valid(self, fruit_slogan):
"""
:param fruit_slogan: 检查fruit_slogan是否有效
:return:
"""
return fruit_slogan != self.place_holder
class AppleSlogan(FruitSlogan):
def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
super().__init__(fruit, fruit_slogan, fruit_keyword, place_holder="")
def get_slogan(self, sub_variety):
fruit_slogan = "{}{}".format(sub_variety, self.fruit_slogan)
return fruit_slogan if sub_variety else self.place_holder
def get_keyword(self):
return self.fruit_slogan
class FruitSloganManager:
def __init__(self, place_holder="", start_delimiter="=>", delimiter="#"):
self.fruit_list = [
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
FruitSlogan("梨", "不梨不弃", "不梨不弃"),
FruitSlogan("火龙果", "风风火火都是我", "风风火火都是我")
]
self.statistic_map = {fruit.get_keyword(): 0 for fruit in self.fruit_list}
self.place_holder = place_holder
self.start_delimiter = start_delimiter
self.delimiter = delimiter
self.total_cnt = 0
def reset(self):
self.total_cnt = 0
def add_total2statistic_data(self, key="水果标语总计"):
"""
:param key: 总和对应的key
:param total_cnt: 统计总和
:return:
"""
self.statistic_map[key] = self.total_cnt
def add_guide_header(self, guide_msg, slogan_content):
return "{}{}{}".format(guide_msg, self.start_delimiter, slogan_content)
def create_slogan(self, status_list, guide_msg="有趣的水果标语们"):
self.total_cnt += 1
content_list = []
for i in range(len(status_list)):
chk = self.fruit_list[i]
msg = chk.get_slogan(status_list[i])
content_list.append(msg)
slogan_content = self.delimiter.join(content_list)
if guide_msg:
slogan_content = self.add_guide_header(guide_msg, slogan_content)
return slogan_content
def parse_slogan_and_statistic(self, slogan):
pattern = "{}".format(re.escape(self.delimiter))
start_index = slogan.find(self.start_delimiter)
if start_index != -1: # 如果slogan中包含引导语,则将引导语去掉
slogan = slogan[start_index + len(self.start_delimiter):]
slogan_list = re.split(pattern, slogan)
for i, slogan in enumerate(slogan_list):
checker = self.fruit_list[i]
if checker.is_status_valid(slogan): # 如果check_valid返回True说明这个检查项正确,不需要统计到错误原因中
keyword = checker.get_keyword()
self.statistic_map[keyword] += 1
def slogan_statistic(self, slogans, need_total=True):
for slogan in slogans:
self.parse_slogan_and_statistic(slogan)
if need_total:
self.add_total2statistic_data()
self.reset() # 复位总计值,为下次任务做准备
def dispaly(self):
print(list(self.statistic_map.keys()))
print(json.dumps(self.statistic_map, ensure_ascii=False, indent=2))
def do_task1():
status_lists = [
["红富士", "", "", True, False],
["", "红将军", "", False, False],
["", "红将军", "", False, True],
["红富士", "", "金冠", True, False],
]
mgr = FruitSloganManager()
print("对象唯一标识:", id(mgr)) # 返回对象的唯一标识符
print('-' * 30, '产生的标语如下', '-' * 30)
slogans = []
for status_list in status_lists:
slogan_content = mgr.create_slogan(status_list)
print(slogan_content)
slogans.append(slogan_content)
print('-' * 30, '统计结果如下', '-' * 30)
mgr.slogan_statistic(slogans)
mgr.dispaly()
def do_task2():
status_lists = [
["红富士", "", "", True, True],
["红富士", "红将军", "", False, False],
["", "红将军", "金冠", False, True],
["", "", "金冠", True, False],
["红富士", "", "金冠", False, False],
]
mgr = FruitSloganManager()
print("对象唯一标识:", id(mgr)) # 返回对象的唯一标识符
print('-' * 30, '产生的标语如下', '-' * 30)
slogans = []
for status_list in status_lists:
slogan_content = mgr.create_slogan(status_list)
print(slogan_content)
slogans.append(slogan_content)
print('-' * 30, '统计结果如下', '-' * 30)
mgr.slogan_statistic(slogans)
mgr.dispaly()
if __name__ == "__main__":
do_task1()
print()
do_task2()
运行结果
对象唯一标识: 4631980112
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!#不梨不弃#
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
"苹果,好懂我的健康哦!": 5,
"不梨不弃": 2,
"风风火火都是我": 1,
"水果标语总计": 4
}
对象唯一标识: 4631980112
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!#金冠苹果,好懂我的健康哦!##风风火火都是我
有趣的水果标语们=>##金冠苹果,好懂我的健康哦!#不梨不弃#
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!##
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
"苹果,好懂我的健康哦!": 8,
"不梨不弃": 2,
"风风火火都是我": 2,
"水果标语总计": 5
}
加上单例模式
为什么要加上单例模式呢?因为在我的程序中,需要周期性地去完成这样一个统计,所以,如果不将FruitSloganManager变成一个单例,那么就会不停地创建多个FruitSloganManager类的对象,内存开销大。
import re
import json
import threading
class Singleton(type):
_instance_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
with Singleton._instance_lock:
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class FruitSlogan(object):
def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
self.fruit = fruit
self.fruit_slogan = fruit_slogan
self.fruit_keyword = fruit_keyword
self.place_holder = place_holder
def get_slogan(self, status_phrase):
return self.fruit_slogan if status_phrase else self.place_holder
def get_keyword(self):
return self.fruit_keyword
def is_status_valid(self, fruit_slogan):
"""
:param fruit_slogan: 检查fruit_slogan是否有效
:return:
"""
return fruit_slogan != self.place_holder
class AppleSlogan(FruitSlogan):
def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
super().__init__(fruit, fruit_slogan, fruit_keyword, place_holder="")
def get_slogan(self, sub_variety):
fruit_slogan = "{}{}".format(sub_variety, self.fruit_slogan)
return fruit_slogan if sub_variety else self.place_holder
def get_keyword(self):
return self.fruit_slogan
class FruitSloganManager(object, metaclass=Singleton):
def __init__(self, place_holder="", start_delimiter="=>", delimiter="#"):
self.fruit_list = [
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
FruitSlogan("梨", "不梨不弃", "不梨不弃"),
FruitSlogan("火龙果", "风风火火都是我", "风风火火都是我")
]
self.place_holder = place_holder
self.start_delimiter = start_delimiter
self.delimiter = delimiter
self.reset()
def reset(self):
# 复位总计值,为下次任务做准备
self.total_cnt = 0
self.statistic_map = {fruit.get_keyword(): 0 for fruit in self.fruit_list}
def add_total2statistic_data(self, key="水果标语总计"):
"""
:param key: 总和对应的key
:param total_cnt: 统计总和
:return:
"""
self.statistic_map[key] = self.total_cnt
def add_guide_header(self, guide_msg, slogan_content):
return "{}{}{}".format(guide_msg, self.start_delimiter, slogan_content)
def create_slogan(self, status_list, guide_msg="有趣的水果标语们"):
self.total_cnt += 1
content_list = []
for i in range(len(status_list)):
chk = self.fruit_list[i]
msg = chk.get_slogan(status_list[i])
content_list.append(msg)
slogan_content = self.delimiter.join(content_list)
if guide_msg:
slogan_content = self.add_guide_header(guide_msg, slogan_content)
return slogan_content
def parse_slogan_and_statistic(self, slogan):
pattern = "{}".format(re.escape(self.delimiter))
start_index = slogan.find(self.start_delimiter)
if start_index != -1: # 如果slogan中包含引导语,则将引导语去掉
slogan = slogan[start_index + len(self.start_delimiter):]
slogan_list = re.split(pattern, slogan)
for i, slogan in enumerate(slogan_list):
checker = self.fruit_list[i]
if checker.is_status_valid(slogan): # 如果check_valid返回True说明这个检查项正确,不需要统计到错误原因中
keyword = checker.get_keyword()
self.statistic_map[keyword] += 1
def slogan_statistic(self, slogans, need_total=True):
for slogan in slogans:
self.parse_slogan_and_statistic(slogan)
if need_total:
self.add_total2statistic_data()
self.reset() # 复位总计值,为下次任务做准备
def dispaly(self):
print(list(self.statistic_map.keys()))
print(json.dumps(self.statistic_map, ensure_ascii=False, indent=2))
def do_task1():
status_lists = [
["红富士", "", "", True, False],
["", "红将军", "", False, False],
["", "红将军", "", False, True],
["红富士", "", "金冠", True, False],
]
mgr = FruitSloganManager()
print("对象唯一标识:", id(mgr)) # 返回对象的唯一标识符
print('-' * 30, '产生的标语如下', '-' * 30)
slogans = []
for status_list in status_lists:
slogan_content = mgr.create_slogan(status_list)
print(slogan_content)
slogans.append(slogan_content)
print('-' * 30, '统计结果如下', '-' * 30)
mgr.slogan_statistic(slogans)
mgr.dispaly()
mgr.reset()
def do_task2():
status_lists = [
["红富士", "", "", True, True],
["红富士", "红将军", "", False, False],
["", "红将军", "金冠", False, True],
["", "", "金冠", True, False],
["红富士", "", "金冠", False, False],
]
mgr = FruitSloganManager()
print("对象唯一标识:", id(mgr)) # 返回对象的唯一标识符
print('-' * 30, '产生的标语如下', '-' * 30)
slogans = []
for status_list in status_lists:
slogan_content = mgr.create_slogan(status_list)
print(slogan_content)
slogans.append(slogan_content)
print('-' * 30, '统计结果如下', '-' * 30)
mgr.slogan_statistic(slogans)
mgr.dispaly()
mgr.reset()
if __name__ == "__main__":
do_task1()
print()
do_task2()
运行结果
对象唯一标识: 4472374224
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!#不梨不弃#
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
"苹果,好懂我的健康哦!": 5,
"不梨不弃": 2,
"风风火火都是我": 1,
"水果标语总计": 4
}
对象唯一标识: 4472300496
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#风风火火都是我
有趣的水果标语们=>红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!###
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!#金冠苹果,好懂我的健康哦!##风风火火都是我
有趣的水果标语们=>##金冠苹果,好懂我的健康哦!#不梨不弃#
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!##
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '水果标语总计']
{
"苹果,好懂我的健康哦!": 8,
"不梨不弃": 2,
"风风火火都是我": 2,
"水果标语总计": 5
}
添加新的水果
添加新的水果时,只需要添加一个新的水果对应的FruitSlogan类对象,并在状态列表中添加上,每一个slogan短句该水果标语对应的状态。
在添加新的水果时,不需要改动代码,而只需添加代码,符合设计模式中的开闭原则,只需添加新的代码就可以完成功能。
import re
import json
import threading
class Singleton(type):
_instance_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
with Singleton._instance_lock:
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class FruitSlogan(object):
def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
self.fruit = fruit
self.fruit_slogan = fruit_slogan
self.fruit_keyword = fruit_keyword
self.place_holder = place_holder
def get_slogan(self, status_phrase):
return self.fruit_slogan if status_phrase else self.place_holder
def get_keyword(self):
return self.fruit_keyword
def is_status_valid(self, fruit_slogan):
"""
:param fruit_slogan: 检查fruit_slogan是否有效
:return:
"""
return fruit_slogan != self.place_holder
class AppleSlogan(FruitSlogan):
def __init__(self, fruit, fruit_slogan, fruit_keyword, place_holder=""):
super().__init__(fruit, fruit_slogan, fruit_keyword, place_holder="")
def get_slogan(self, sub_variety):
fruit_slogan = "{}{}".format(sub_variety, self.fruit_slogan)
return fruit_slogan if sub_variety else self.place_holder
def get_keyword(self):
return self.fruit_slogan
class FruitSloganManager(object, metaclass=Singleton):
def __init__(self, place_holder="", start_delimiter="=>", delimiter="#"):
self.fruit_list = [
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
AppleSlogan("苹果", "苹果,好懂我的健康哦!", "苹果,好懂我的健康哦!"),
FruitSlogan("梨", "不梨不弃", "不梨不弃"),
FruitSlogan("火龙果", "风风火火都是我", "风风火火都是我"),
FruitSlogan("香蕉", "智慧之果", "智慧之果")
]
self.place_holder = place_holder
self.start_delimiter = start_delimiter
self.delimiter = delimiter
self.reset()
def reset(self):
# 复位总计值,为下次任务做准备
self.total_cnt = 0
self.statistic_map = {fruit.get_keyword(): 0 for fruit in self.fruit_list}
def add_total2statistic_data(self, key="水果标语总计"):
"""
:param key: 总和对应的key
:param total_cnt: 统计总和
:return:
"""
self.statistic_map[key] = self.total_cnt
def add_guide_header(self, guide_msg, slogan_content):
return "{}{}{}".format(guide_msg, self.start_delimiter, slogan_content)
def create_slogan(self, status_list, guide_msg="有趣的水果标语们"):
self.total_cnt += 1
content_list = []
for i in range(len(status_list)):
chk = self.fruit_list[i]
msg = chk.get_slogan(status_list[i])
content_list.append(msg)
slogan_content = self.delimiter.join(content_list)
if guide_msg:
slogan_content = self.add_guide_header(guide_msg, slogan_content)
return slogan_content
def parse_slogan_and_statistic(self, slogan):
pattern = "{}".format(re.escape(self.delimiter))
start_index = slogan.find(self.start_delimiter)
if start_index != -1: # 如果slogan中包含引导语,则将引导语去掉
slogan = slogan[start_index + len(self.start_delimiter):]
slogan_list = re.split(pattern, slogan)
for i, slogan in enumerate(slogan_list):
checker = self.fruit_list[i]
if checker.is_status_valid(slogan): # 如果check_valid返回True说明这个检查项正确,不需要统计到错误原因中
keyword = checker.get_keyword()
self.statistic_map[keyword] += 1
def slogan_statistic(self, slogans, need_total=True):
for slogan in slogans:
self.parse_slogan_and_statistic(slogan)
if need_total:
self.add_total2statistic_data()
def dispaly(self):
print(list(self.statistic_map.keys()))
print(json.dumps(self.statistic_map, ensure_ascii=False, indent=2))
def do_task1():
status_lists = [
["红富士", "", "", True, False, False],
["", "红将军", "", False, False, True],
["", "红将军", "", False, True, True],
["红富士", "", "金冠", True, False, True],
]
mgr = FruitSloganManager()
print("对象唯一标识:", id(mgr)) # 返回对象的唯一标识符
print('-' * 30, '产生的标语如下', '-' * 30)
slogans = []
for status_list in status_lists:
slogan_content = mgr.create_slogan(status_list)
print(slogan_content)
slogans.append(slogan_content)
print('-' * 30, '统计结果如下', '-' * 30)
mgr.slogan_statistic(slogans)
mgr.dispaly()
mgr.reset()
def do_task2():
status_lists = [
["红富士", "", "", True, True, False],
["红富士", "红将军", "", False, False, True],
["", "红将军", "金冠", False, True, False],
["", "", "金冠", True, False, False],
["红富士", "", "金冠", False, False, True],
]
mgr = FruitSloganManager()
print("对象唯一标识:", id(mgr)) # 返回对象的唯一标识符
print('-' * 30, '产生的标语如下', '-' * 30)
slogans = []
for status_list in status_lists:
slogan_content = mgr.create_slogan(status_list)
print(slogan_content)
slogans.append(slogan_content)
print('-' * 30, '统计结果如下', '-' * 30)
mgr.slogan_statistic(slogans)
mgr.dispaly()
mgr.reset()
if __name__ == "__main__":
do_task1()
print()
do_task2()
运行结果
对象唯一标识: 4680378448
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃##
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!####智慧之果
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!###风风火火都是我#智慧之果
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!#不梨不弃##智慧之果
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '智慧之果', '水果标语总计']
{
"苹果,好懂我的健康哦!": 5,
"不梨不弃": 2,
"风风火火都是我": 1,
"智慧之果": 3,
"水果标语总计": 4
}
对象唯一标识: 4680378448
------------------------------ 产生的标语如下 ------------------------------
有趣的水果标语们=>红富士苹果,好懂我的健康哦!###不梨不弃#风风火火都是我#
有趣的水果标语们=>红富士苹果,好懂我的健康哦!#红将军苹果,好懂我的健康哦!####智慧之果
有趣的水果标语们=>#红将军苹果,好懂我的健康哦!#金冠苹果,好懂我的健康哦!##风风火火都是我#
有趣的水果标语们=>##金冠苹果,好懂我的健康哦!#不梨不弃##
有趣的水果标语们=>红富士苹果,好懂我的健康哦!##金冠苹果,好懂我的健康哦!###智慧之果
------------------------------ 统计结果如下 ------------------------------
['苹果,好懂我的健康哦!', '不梨不弃', '风风火火都是我', '智慧之果', '水果标语总计']
{
"苹果,好懂我的健康哦!": 8,
"不梨不弃": 2,
"风风火火都是我": 2,
"智慧之果": 2,
"水果标语总计": 5
}