鱼C论坛

 找回密码
 立即注册
查看: 2454|回复: 48

[已解决]Python:每日一题 335

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

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

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

x
今天的题目:


给定一个英文段落 paragraph 和一组限定词 banned,返回最出现次数最多的非限定单词

说明:
1. 至少有一个单词是非限定的。
2. 保证答案唯一。
3. 限定词都是以小写字母给出,paragraph 中的单词大小写不敏感。结果请返回小写字母。
4. 英文段落 paragraph 仅由字母、空格、标点 !?',;. 组成。


示例 1:

输入:paragraph = "Bob hit a ball, the hit BALL flew far after it was hit." 和 banned = ["hit"]
输出:"ball"
解释:
"hit" 出现 3 次但是限定词。
"ball" 出现 2 次,是出现次数最多的非限定词。
注意段落中大小写不敏感,标点符号忽略

示例 2:

输入:paragraph = "a a a b b c c d" 和 banned = ["a","b"]
输出:c"
解释:
"a" 和 "b" 都是限定词
"c" 出现了 2 次,而 "d" 只出现过一次
所以输出 "c"


欢迎大家一起答题!
最佳答案
2020-2-20 01:55:26
  1. import collections
  2. def fc335(paragraph,banned):
  3.         return collections.Counter([i.strip('!?\',;.') for i in paragraph.lower().split() if i.strip('!?\',;.') not in banned]).most_common(1)[0][0]
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-19 21:40:02 | 显示全部楼层
  1. def func(paragraph, banned):
  2.     list1 = [i.strip("  !?',;.").lower() for i in paragraph.split() if i.strip("  !?',;.") not in banned]
  3.     list2 = list(set(list1))
  4.     list2.sort(key = lambda x: list1.count(x))
  5.     return list2[-1]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-19 22:07:23 | 显示全部楼层
  1. def solve(s:str, ban):
  2.     d, e = {}, ''
  3.     for i in s:
  4.         if i not in [' ','!','?',',',';','.',"'"]:
  5.             e += i
  6.         else:
  7.             e = e.lower()
  8.             if d.get(e):
  9.                 d[e] += 1
  10.             elif not d.get(e) and e not in ban:
  11.                 d[e] = 1
  12.             e = ''
  13.     res = sorted(d.items(), key = lambda x : -x[1])
  14.    
  15.     return res[0][0]
  16. print(solve( "a a a b b c c d",["a","b"]))
复制代码

同时敲两种语言太累了,我老想末尾打分号

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-19 22:40:43 | 显示全部楼层
本帖最后由 fan1993423 于 2020-2-19 22:57 编辑
  1. from collections import Counter
  2. from re import split as sp
  3. def fun335(paragraph,banned):
  4.     paragraph=paragraph.lower()
  5.     each_word=sp(" |!|\?|'|,|;|\.",paragraph)
  6.     for k,v in Counter(each_word).most_common(len(banned)+2):
  7.         if k=='':continue
  8.         elif k not in banned:return k
复制代码

评分

参与人数 1荣誉 +6 鱼币 +6 收起 理由
zltzlt + 6 + 6

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-19 22:49:01 | 显示全部楼层
  1. def func335(paragraph, banned):
  2.     paragraph = paragraph.lower()
  3.     for each in banned + list("!?',;."):
  4.         paragraph = paragraph.replace(each.lower(), '')
  5.     result = paragraph.split()
  6.     return max(result, key=result.count)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2020-2-20 00:45:49 | 显示全部楼层
def fic(para,each):
    length = len(para)
    for i in range(length):
        if para[i] == each:
            return 1
    return 0

def func(paragraph,banned):
    paragraph1 = paragraph.lower()
    para = paragraph1.split(' ')
    for i in range(len(para)):
        for e in list("!?',;."):
            para[i] = para[i].replace(e,'')
    i = 0
    for each in banned:
        while True:
            if fic(para,each):
                para.remove(each)
            else:
                break           
    a = max(para, key=para.count)
    return a

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 01:16:20 | 显示全部楼层
  1. from collections import Counter   
  2. def p335(p,b):
  3.     lt = [i.strip("!?',;.").lower() for i in p.split() if i.strip(" ") not in b]
  4.     return Counter(lt).most_common(1)[0][0]
  5.    
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 01:55:26 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
  1. import collections
  2. def fc335(paragraph,banned):
  3.         return collections.Counter([i.strip('!?\',;.') for i in paragraph.lower().split() if i.strip('!?\',;.') not in banned]).most_common(1)[0][0]
复制代码

评分

参与人数 1荣誉 +6 鱼币 +6 收起 理由
zltzlt + 6 + 6

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 02:49:29 | 显示全部楼层
  1. import string
  2. def func(paragraph, banned):
  3.     L1 = [i.strip(string.punctuation).lower() for i in paragraph.split() if i.strip(string.punctuation) not in banned]
  4.     L2 = list(set(L1))
  5.     L3 = [L1.count(x) for x in L2]
  6.     return L2[L3.index(max(L3))]
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-2-20 09:53:24 | 显示全部楼层
  1. def solution(pre_str , banned):
  2.     pre_str = str(pre_str)
  3.     pre_str = pre_str.lower()
  4.     char = ["!","?","'",",",";","."]
  5.     for each in char:
  6.         pre_str = pre_str.replace(each," ")

  7.     temp = pre_str.split(" ")
  8.     dict_r = {}
  9.     for each in temp:
  10.         dict_r.setdefault(each,0)
  11.     for each in temp:
  12.         dict_r[each] += 1
  13.     for each in banned:
  14.         dict_r.pop(each)
  15.     i = 0
  16.     temp_list = []
  17.     for each in dict_r.keys():
  18.         if i<dict_r[each]:
  19.             temp_list.append(each)
  20.             i = dict_r[each]
  21.    
  22.     result = temp_list.pop()
  23.     print(result)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 11:19:09 | 显示全部楼层
字符串的函数除了split其他的用得不多,记不住,自己去编辑吧,锻炼一下自己的逻辑分析能力
  1. def fun335(paragraph,banned):
  2.     def bigToSmall(string):#忘了大小写函数了,惭愧;此函数用的不多
  3.         score = ord(string)#string 这里限定为字母
  4.         if score > 90:
  5.             return string
  6.         else:
  7.             return chr(score+32)
  8.     dictionary = dict()
  9.     M = len(paragraph)
  10.    
  11.     index = 0
  12.     preAlpha = ''
  13.     word = ''
  14.     while index < M:
  15.         temp = paragraph[index]
  16.         if temp.isalpha():
  17.             temp = bigToSmall(temp)
  18.             word += temp
  19.             preAlpha = temp
  20.         else:
  21.             if preAlpha != '':
  22.                 if word not in banned:
  23.                     try:
  24.                         dictionary[word] += 1
  25.                     except Exception:
  26.                         dictionary[word] = 1
  27.                     preAlpha = ''
  28.                     word = ''
  29.                 else:
  30.                     preAlpha = ''
  31.                     word = ''
  32.             else:
  33.                 pass
  34.         index += 1
  35.     else:
  36.         if preAlpha != '':
  37.             if word not in banned:
  38.                 try:
  39.                     dictionary[word] += 1
  40.                 except Exception:
  41.                     dictionary[word] = 1
  42.             else:
  43.                 pass   
  44.     sorted_items = sorted(dictionary.items(),key = lambda x:-x[1])
  45.     return sorted_items[0][0]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 13:14:56 | 显示全部楼层
本帖最后由 一个账号 于 2020-2-20 14:55 编辑
  1. def fun(paragraph : str, banned : list) -> str:
  2.     paragraph = paragraph.lower()
  3.     paragraph = list(paragraph)   
  4.     pun = "!?',;."
  5.     list1 = []
  6.     list2 = []
  7.     count = {}
  8.    
  9.     for each in paragraph:
  10.         if each not in pun:
  11.             list1.append(each)

  12.     list1 = "".join(list1)
  13.         
  14.     paragraph = list1.split(" ")

  15.     for word in banned:
  16.         for i in range(paragraph.count(word)):
  17.             paragraph.remove(word)

  18.     for each in paragraph:
  19.         if each not in list2:
  20.             list2.append(each)

  21.     for each in list2:
  22.         count[paragraph.count(each)] = each
  23.             
  24.     return count.get(max(count))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 13:58:39 | 显示全部楼层

考虑一下效率的问题,看你的答案十有八九会超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 13:59:28 | 显示全部楼层
zltzlt 发表于 2020-2-20 13:58
考虑一下效率的问题,看你的答案十有八九会超时

你没测试怎么知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:05:46 | 显示全部楼层
  1. for each in paragraph:
  2.         if "." in each:
  3.             each
复制代码


你这一句什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:08:54 | 显示全部楼层
本帖最后由 zltzlt 于 2020-2-20 14:10 编辑


输入 paragraph = " ".join(['a', 'c', 'b'] * 100000), banned = ["a", "b"] 超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:10:31 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:11:14 | 显示全部楼层
wanting-for 发表于 2020-2-19 22:07
同时敲两种语言太累了,我老想末尾打分号

输入 paragraph = "Bob", banned = [] 出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:12:00 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-20 14:12:58 | 显示全部楼层

解答错误

输入:paragraph = "abc abc? abcd the jeff!", banned = ["abc","abcd","jeff"]
输出:"d"
预期结果:"the"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 04:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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