字母汤 - 确定您是否可以用汤碗中的字母写下您的信息
Alphabet Soup -Determine if you can write your message with the letters found in your bowl of soup
我在 python 中接到了一个任务要解决,需要帮助,因为我无法获得输出,下面是问题:-
每个人都喜欢字母汤。当然,您想知道您是否可以根据碗中的字母构建一条消息。
您的任务:
编写一个将两个字符串作为输入的函数:
- 您要写的消息
- 在你的一碗字母汤中找到的所有字母
假设:
- 可能是一大碗汤,里面有很多字母
- 不能保证每个字母出现的次数相似 - 实际上有些字母可能会完全丢失
- 字母随机排列
该函数应确定您是否可以使用在汤碗中找到的字母来写消息。该函数应相应地 return True 或 False。
努力使您的功能高效。请使用大 O 符号来解释你的函数需要多长时间 运行 根据你的消息长度 (m) 和你碗汤中的字母数 (s)。
下面是我试过的代码,但它没有按照任务运行:-
def sol(alpha):
srt = sorted(list(alpha))
lwcase = sorted(list(alpha.lower()))
upcase = []
result = ''
for i in srt:
if i.isupper():
upcase.append(i)
for e in lwcase:
if upcase.count(e.upper()) != 0:
result += e.upper()
upcase.pop(upcase.index(e.upper()))
else:
result += e
return result
it = input("Enter a word please")
print(sol(it))
这是我的解决方案(见评论):
def validate_soup(s: str, chars: str)-> bool:
d = {}
for c in chars:
count = d.get(c, 0)
d[c] = count + 1
for c in s:
count = d.get(c, 0)
if count <= 0:
return False
d[c] = count - 1
return True
我假设你的老师希望你自己编写一个算法来进行 scratch。然而,了解如何使用标准库的模块是一项非常有用的技能。这是一个使用 collections.Counter
的解决方案,它是 dict
.
的子类
代码
import collections
def validate_soup(msg, soup):
msg_preprocessed = ''.join(msg.lower().split())
soup_preprocessed = ''.join(soup.lower().split())
msg_count = collections.Counter(msg_preprocessed)
soup_count = collections.Counter(soup_preprocessed)
return all(n <= soup_count[k] for k,n in msg_count.items())
测试
>>> validate_soup('Hello World', 'loollhed')
False
>>> validate_soup('Hello World', 'loollhedw')
False
>>> validate_soup('Hello World', 'loolhedwr')
False
>>> validate_soup('Hello World', 'loollhedwr')
True
>>> validate_soup('Hello World', 'abcloollhedwrdef')
True
说明
首先,处理步骤。
.lower()
将消息变成小写,这样 'Hello World'
和 hello world
是等价的,see the documentation;
''.join(s.split())
删除字符串中的所有空格 s
, see this question;
- 另请参阅该问题:Python: remove all non-alphabet chars from string?;
然后,计数器:
collections.Counter(seq)
生成一个字典,将 seq
的元素映射到它们的出现次数,例如 Counter('helloworld') == {'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1}
;
all()
是一个内置函数,用于检查谓词是否对序列的所有元素都成立,see the doc;
all(n <= soup_count[k] for k,n in msg_count.items())
检查邮件中出现的每个字符 k
的计数 n
是否小于(或等于)字符 k
中的计数汤。
我在 python 中接到了一个任务要解决,需要帮助,因为我无法获得输出,下面是问题:-
每个人都喜欢字母汤。当然,您想知道您是否可以根据碗中的字母构建一条消息。
您的任务:
编写一个将两个字符串作为输入的函数:
- 您要写的消息
- 在你的一碗字母汤中找到的所有字母
假设:
- 可能是一大碗汤,里面有很多字母
- 不能保证每个字母出现的次数相似 - 实际上有些字母可能会完全丢失
- 字母随机排列
该函数应确定您是否可以使用在汤碗中找到的字母来写消息。该函数应相应地 return True 或 False。
努力使您的功能高效。请使用大 O 符号来解释你的函数需要多长时间 运行 根据你的消息长度 (m) 和你碗汤中的字母数 (s)。
下面是我试过的代码,但它没有按照任务运行:-
def sol(alpha):
srt = sorted(list(alpha))
lwcase = sorted(list(alpha.lower()))
upcase = []
result = ''
for i in srt:
if i.isupper():
upcase.append(i)
for e in lwcase:
if upcase.count(e.upper()) != 0:
result += e.upper()
upcase.pop(upcase.index(e.upper()))
else:
result += e
return result
it = input("Enter a word please")
print(sol(it))
这是我的解决方案(见评论):
def validate_soup(s: str, chars: str)-> bool:
d = {}
for c in chars:
count = d.get(c, 0)
d[c] = count + 1
for c in s:
count = d.get(c, 0)
if count <= 0:
return False
d[c] = count - 1
return True
我假设你的老师希望你自己编写一个算法来进行 scratch。然而,了解如何使用标准库的模块是一项非常有用的技能。这是一个使用 collections.Counter
的解决方案,它是 dict
.
代码
import collections
def validate_soup(msg, soup):
msg_preprocessed = ''.join(msg.lower().split())
soup_preprocessed = ''.join(soup.lower().split())
msg_count = collections.Counter(msg_preprocessed)
soup_count = collections.Counter(soup_preprocessed)
return all(n <= soup_count[k] for k,n in msg_count.items())
测试
>>> validate_soup('Hello World', 'loollhed')
False
>>> validate_soup('Hello World', 'loollhedw')
False
>>> validate_soup('Hello World', 'loolhedwr')
False
>>> validate_soup('Hello World', 'loollhedwr')
True
>>> validate_soup('Hello World', 'abcloollhedwrdef')
True
说明
首先,处理步骤。
.lower()
将消息变成小写,这样'Hello World'
和hello world
是等价的,see the documentation;''.join(s.split())
删除字符串中的所有空格s
, see this question;- 另请参阅该问题:Python: remove all non-alphabet chars from string?;
然后,计数器:
collections.Counter(seq)
生成一个字典,将seq
的元素映射到它们的出现次数,例如Counter('helloworld') == {'l': 3, 'o': 2, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1}
;all()
是一个内置函数,用于检查谓词是否对序列的所有元素都成立,see the doc;all(n <= soup_count[k] for k,n in msg_count.items())
检查邮件中出现的每个字符k
的计数n
是否小于(或等于)字符k
中的计数汤。