鱼C论坛

 找回密码
 立即注册
查看: 717|回复: 7

[已解决]各位大佬!怎么将字符串变成变量并将其标号调用

[复制链接]
发表于 2020-2-18 15:21:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
其实这是《零基础学习python》第20课课后作业的动动手一道题,题目如下。

题目:
请用已学过的知识编写程序,统计下边这个长字符串str1中各个字符出现的次数。


小甲鱼思路:使用str.count()直接计算每个字符出现的次数

        str1 = '''+}$]%@^+!##}*(*)&([]+]##%$)+$_^%^@&((+@&)%}${#&$!!($#&^](^^{{(&+]_]@&*#_^+#!(}]$*&
        _+@#[})]])[((#@&]!&]*&{*&#_[#(]{(}!]'''

        list1 = []
        for each in str1:
            if each not in list1:
                if each == '\n':
                    print('\\n', str1.count(each))
                else:
                    print(each, str1.count(each))
                list1.append(each)

个人思路: 主要是计算字符出现次数的算法和小甲鱼有所不同

        for i in str1:
            if i not in list:            
                list.append(i)        #如果字符没有被记录过,则记录该字符于列表中
                (待实现代码)    #Step 1:自动创建对应该字符的计数变量。比如count_i
            else:
                (待实现代码)      #Step 2:如果字符已经被记录,则自动调出对应该字符的计数变量“count_i”,然后加1.
        for each in list:
            print(each,'has showen %d times'%(待实现代码))       #调用"count_i"打印每个记录的字符及其出现次数。

请问有没有大佬可以看看,主要是中间Step 1,Step 2 加粗部分功能怎么实现?谢谢啦!
I love FishC.com!!

最佳答案
2020-2-18 16:04:55
  1. str1 = '''+}$]%@^+!##}*(*)&([]+]##%$)+$_^%^@&((+@&)%}${#&$!!($#&^](^^{{(&+]_]@&*#_^+#!(}]$*&
  2.         _+@#[})]])[((#@&]!&]*&{*&#_[#(]{(}!]'''

  3. dic1 = {}
  4. for i in str1:
  5.         dic1[i] = dic1.get(i,0) + 1
  6. print(dic1)
复制代码

我想的可以直接用字典来解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 16:04:55 | 显示全部楼层    本楼为最佳答案   
  1. str1 = '''+}$]%@^+!##}*(*)&([]+]##%$)+$_^%^@&((+@&)%}${#&$!!($#&^](^^{{(&+]_]@&*#_^+#!(}]$*&
  2.         _+@#[})]])[((#@&]!&]*&{*&#_[#(]{(}!]'''

  3. dic1 = {}
  4. for i in str1:
  5.         dic1[i] = dic1.get(i,0) + 1
  6. print(dic1)
复制代码

我想的可以直接用字典来解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-18 16:26:45 | 显示全部楼层
          既然自己没有高度,就不要限定别人的思路,因为,那同样也没有高度!
【列表方案】:
  1. str1 = '''+}$]%@^+!##}*(*)&([]+]##%$)+$_^%^@&((+@&)%}${#&$!!($#&^](^^{{(&+]_]@&*#_^+#!(}]$*&
  2.     _+@#[})]])[((#@&]!&]*&{*&#_[#(]{(}!]'''
  3. str1 = '' . join(str1 . split('\n')) . strip()
  4. d = []
  5. for c in str1:
  6.     if c not in d:
  7.        d . append(c)
  8.        d . append(str1 . count(c))
  9. for i in range(0 , len(d) , 2):
  10.     c = d[i]
  11.     if c == '\n':
  12.         c = '\\n'
  13.     print(c , d[i + 1])
复制代码

【字典方案】:
  1. str1 = '''+}$]%@^+!##}*(*)&([]+]##%$)+$_^%^@&((+@&)%}${#&$!!($#&^](^^{{(&+]_]@&*#_^+#!(}]$*&
  2.     _+@#[})]])[((#@&]!&]*&{*&#_[#(]{(}!]'''

  3. str1 = '' . join(str1 . split('\n')) . strip()
  4. d = {}
  5. for c in str1:
  6.     d . setdefault(c , 0)
  7.     d[c] += 1
  8. for k , v in d . items():
  9.     if k == '\n':
  10.         k = '\\n'
  11.     print(k , v)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-18 16:33:02 | 显示全部楼层
prophet-1 发表于 2020-2-18 16:04
我想的可以直接用字典来解决。

确实可以唉!!原来这么简单!谢谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-18 16:51:36 | 显示全部楼层
jackz007 发表于 2020-2-18 16:26
既然自己没有高度,就不要限定别人的思路,因为,那同样也没有高度!
【列表方案】:

谢谢大佬回复!你的方法更全面,而且技术性也很强,我看来好久才弄明白d.setdefault,d.items等用法!学到很多,谢谢了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-18 16:56:35 | 显示全部楼层
jackz007 发表于 2020-2-18 16:26
既然自己没有高度,就不要限定别人的思路,因为,那同样也没有高度!
【列表方案】:

请问这两种方案有没有优劣之分呢?

个人觉得列表方案,计算量会更大,因为每循环一个字符都需要计算对应字符的str.count. 而字典方案就不用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 18:23:22 | 显示全部楼层
虽然有更好的方法 但是你的方法可以用eval和exec来实现,这两个函数可以把字符串转化成命令
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 23:25:53 | 显示全部楼层
_Feather_ 发表于 2020-2-20 18:23
虽然有更好的方法 但是你的方法可以用eval和exec来实现,这两个函数可以把字符串转化成命令

之前网上确实也有搜到过这两个函数,不过似乎很麻烦,说实话没看懂具体怎么用。。。而且循环过程中调用好像也不太方便。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 16:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表