36、《纽约时报》每天会发布一个名为“拼字蜜蜂”的谜题,它要求读者仅使用七个字母尽可能多地拼写单词,其中一个字母是必须使用的。单词必须至少有四个字母。编写一个名为
check_word
的函数,用于检查给定的单词是否可接受。该函数应接受要检查的单词、包含七个可用字母的字符串以及包含单个必需字母的字符串作为参数。以下是包含测试用例的函数大纲,请填充该函数,然后检查所有测试用例是否通过。测试用例如下:
check_word
check_word('color', 'ACDLORT', 'R')
应返回
True
check_word('ratatat', 'ACDLORT', 'R')
应返回
True
check_word('rat', 'ACDLORT', 'R')
应返回
False
check_word('told', 'ACDLORT', 'R')
应返回
False
check_word('bee', 'ACDLORT', 'R')
应返回
False
def check_word(word, available, required):
"""Check whether a word is acceptable.
>>> check_word('color', 'ACDLORT', 'R')
True
>>> check_word('ratatat', 'ACDLORT', 'R')
True
>>> check_word('rat', 'ACDLORT', 'R')
False
>>> check_word('told', 'ACDLORT', 'R')
False
>>> check_word('bee', 'ACDLORT', 'R')
False
"""
# 检查单词长度是否至少为4
if len(word) < 4:
return False
# 检查单词是否包含必需字母
if required not in word.upper():
return False
# 检查单词中的字母是否都在可用字母中
for letter in word.upper():
if letter not in available:
return False
return True
37、根据“拼字蜜蜂”游戏规则:四字母单词每个计1分;更长的单词每个字母计1分;每个谜题至少有一个使用了所有字母的“全字母句”,这类单词额外加7分。编写一个名为score_word的函数,该函数接受一个单词和一个由可用字母组成的字符串作为参数,并返回该单词的得分。可以假设该单词是符合规则的。
def score_word(word, available):
'''Compute the score for an acceptable word.
>>> score_word('card', 'ACDLORT')
1
>>> score_word('color', 'ACDLORT')
5
>>> score_word('cartload', 'ACDLORT')
15
'''
score = len(word) if len(word) > 4 else 1
if len(set(word)) == len(set(available)):
score += 7
return score
38、如果你有一个能正常工作的 uses_only 函数,该函数用于检查一个单词是否只使用了指定字符串中的字母。请编写一个调用 uses_only 的 uses_all 函数,用于检查一个单词是否使用了指定字符串中的所有字母。
可以通过以下思路编写
uses_all
函数:将问题转换为检查指定字符串中的所有字母是否都能组成一个只包含这些字母且能构成原单词的字符串。以下是示例代码:
def uses_only(word, available):
return set(word) <= set(available)
def uses_all(word, required):
return uses_only(required, word)
这里
uses_all
函数调用了
uses_only
函数,将
required
和
word
作为参数传入
uses_only
函数,以此来判断
word
是否使用了
required
中的所有字母。
39、给定一个函数 uses_only,它接受两个字符串并检查第一个字符串是否仅使用了第二个字符串中的字母。用它来编写 uses_all 函数,该函数接受两个字符串并检查第一个字符串是否使用了第二个字符串中的所有字母,允许字母重复。使用 run_doctests 来检查答案。
要基于
uses_only
函数实现
uses_all
函数,可以这样考虑:对于
uses_all
函数中要求的第二个字符串里的每个字母,都需要检查它是否在第一个字符串中。可以遍历第二个字符串的每个字母,构造一个仅含该字母的字符串,然后用
uses_only
函数检查第一个字符串是否使用了这个字母。以下是实现代码:
from collections import Counter
def uses_only(word, available):
return set(word) <= set(available)
def uses_all(word, required):
for letter in set(required):
if not uses_only(word, letter):
return False
return True
可以添加
doctest
来验证:
import doctest
def uses_only(word, available):
return set(word) <= set(available)
def uses_all(word, required):
"""
Checks whether a word uses all required letters.
>>> uses_all('banana', 'ban')
True
>>> uses_all('apple', 'api')
False
>>> uses_all('programming', 'pgm')
True
"""
for letter in set(required):
if not uses_only(word, letter):
return False
return True
doctest.testmod()
运行上述代码,如果没有输出错误信息,说明代码通过了
doctest
测试。
40、Python 中的原始字符串是什么?
正则表达式的引号前通常有字母 r,它表示这是一个原始字符串。
41、编写一个函数,其功能与 shell 命令!head 相同。该函数应接受三个参数:要读取的文件名、要读取的行数以及要将这些行写入的文件名。如果第三个参数为 None,则应显示这些行而不是将它们写入文件。要求不要使用 with 语句或 try 语句。
以下是实现该功能的 Python 代码:
def custom_head(file_to_read, num_lines, file_to_write=None):
file = open(file_to_read, 'r')
lines = file.readlines()[:num_lines]
file.close()
if file_to_write is None:
for line in lines:
print(line.strip())
else:
output_file = open(file_to_write, 'w')
for line in lines:
output_file.write(line)
output_file.close()
42、Python 提供了一个名为 reversed 的内置函数,它接受一个元素序列(如列表或字符串)作为参数,并返回一个包含逆序元素的反转对象。回文是一个正向和反向拼写都相同的单词,如“noon”和“rotator”。编写一个名为 is_palindrome 的函数,它接受一个字符串参数,如果该字符串是回文则返回 True,否则返回 False。
以下是实现
is_palindrome
函数的代码:
def reverse_word(word):
return ''.join(reversed(word))
def is_palindrome(word):
return reverse_word(word) == word
43、编写一个名为reverse_sentence的函数,该函数接受一个由任意数量的单词(用空格分隔)组成的字符串作为参数。它应返回一个新的字符串,其中包含按相反顺序排列的相同单词。例如,如果参数是“Reverse this sentence”,结果应该是“Sentence this reverse”。提示:你可以使用capitalize方法将第一个单词大写,并将其他单词转换为小写。
以下是实现该功能的 Python 代码:
def reverse_sentence(sentence):
words = sentence.split()
reversed_words = ' '.join(reversed(words)).capitalize()
parts = reversed_words.split(' ', 1)
if len(parts) > 1:
first_word = parts[0]
rest = parts[1].lower()
return f'{first_word} {rest}'
return reversed_words
44、编写一个名为 total_length 的函数,该函数接受一个字符串列表作为参数,并返回这些字符串的总长度。
以下是实现
total_length
函数的 Python 代码:
def total_length(str_list):
return sum(len(s) for s in str_list)
你可以使用以下方式调用这个函数来验证字符串列表的总长度:
word_list = []
for line in open('words.txt'):
word = line.strip()
word_list.append(word)
print(total_length(word_list))
45、为什么Python字典中的键必须是可哈希的?
字典使用哈希表,需要用哈希函数将键转换为整数(哈希值)来存储和查找键。该系统正常工作的前提是键是不可变的,这样其哈希值始终不变。如果键是可变的,其哈希值可能改变,字典就无法正常工作。所以键必须是可哈希的,像列表这种可变类型不能作为键。
46、如何从字符串列表创建Python集合,并检查某个字符串是否为该集合的元素?
要从字符串列表创建 Python 集合,可以使用内置的
set()
函数。要检查某个字符串是否为集合的元素,可以使用
in
运算符。以下是示例代码:
string_list = ['apple', 'banana', 'cherry']
string_set = set(string_list)
# 检查某个字符串是否为集合的元素
target_string = 'banana'
if target_string in string_set:
print(f'{target_string} 是集合的元素。')
else:
print(f'{target_string} 不是集合的元素。')
47、编写一个名为 has_duplicates 的函数,该函数接受一个序列(如列表或字符串)作为参数,如果序列中有任何元素出现不止一次,则返回 True。
以下是使用集合实现该功能的函数代码:
def has_duplicates(t):
s = set(t)
return len(s) < len(t)
48、编写一个名为 find_repeats 的函数,该函数接受一个将每个键映射到计数器的字典,就像 value_counts 函数的结果一样。它应该遍历字典并返回一个包含计数大于 1 的键的列表。
def find_repeats(counter):
result = []
for key, value in counter.items():
if value > 1:
result.append(key)
return result
49、假设你对两个不同的单词使用
value_counts
函数,并将结果保存在两个字典中:
counter1 = value_counts('brontosaurus')
;
counter2 = value_counts('apatosaurus')
。每个字典将一组字母映射到它们出现的次数。编写一个名为
add_counters
的函数,该函数接受两个这样的字典,并返回一个新的字典,其中包含所有字母以及它们在任意一个单词中出现的总次数。
value_counts
counter1 = value_counts('brontosaurus')
counter2 = value_counts('apatosaurus')
add_counters
以下是实现
add_counters
函数的代码:
def add_counters(counter1, counter2):
result = counter1.copy()
for key, value in counter2.items():
if key in result:
result[key] += value
else:
result[key] = value
return result
50、编写一个名为 is_interlocking 的函数,该函数接受一个单词作为参数,如果这个单词可以拆分成两个有意义的联锁词,则返回 True,否则返回 False。
以下是实现该功能的 Python 代码:
def is_interlocking(word):
first = word[0::2]
second = word[1::2]
# 这里假设存在一个名为 valid_words 的单词列表,用于判断拆分后的单词是否有效
valid_words = ['示例单词1', '示例单词2'] # 实际使用时需要替换为真实的单词列表
return first in valid_words and second in valid_words
在实际应用中,需要有一个真实的单词列表来判断
first
和
second
是否为有效的单词。
51、编写一行代码,将值 6 追加到元组 t 中第二个列表的末尾。如果显示 t,结果应该是 ([1, 2, 3], [4, 5, 6])。尝试创建一个将 t 映射到字符串的字典,并确认会得到一个类型错误。
追加值的代码:
t[1].append(6)
创建字典并确认错误的代码:
d = {t: 'example'}
运行此代码会抛出
TypeError
。
52、编写一个名为 shift_word 的函数,该函数接受一个字符串和一个整数作为参数,并返回一个新字符串,新字符串中的字母是原字符串中的字母按给定的位数进行移位后的结果。为了测试你的函数,请确认“cheer”移位 7 位后是“jolly”,“melon”移位 16 位后是“cubed”。
以下是实现
shift_word
函数的 Python 代码:
letter_map = {chr(97 + i): i for i in range(26)}
letters = [chr(97 + i) for i in range(26)]
def shift_word(word, shift):
result = []
for letter in word:
index = letter_map[letter]
new_index = (index + shift) % 26
result.append(letters[new_index])
return ''.join(result)
# 测试函数
print(shift_word("cheer", 7)) # 输出: jolly
print(shift_word("melon", 16)) # 输出: cubed
53、编写一个名为most_frequent_letters的函数,该函数接受一个字符串,并按字母出现频率从高到低的顺序打印这些字母。
以下是实现该功能的Python代码:
def most_frequent_letters(s):
letter_count = {}
for letter in s:
if letter.isalpha():
letter = letter.lower()
if letter in letter_count:
letter_count[letter] += 1
else:
letter_count[letter] = 1
sorted_letters = sorted(letter_count.items(), key=lambda item: item[1], reverse=True)
for letter, freq in sorted_letters:
print(letter, freq)
54、编写一个名为 word_distance 的函数,该函数接受两个长度相同的单词,并返回这两个单词不同字母位置的数量。
以下是实现该功能的 Python 代码:
def word_distance(word1, word2):
return sum(a != b for a, b in zip(word1, word2))
55、编写一个程序,找出单词列表中所有的换位对。
以下是实现该功能的具体步骤和示例代码:
对单词列表中的每个单词,将其字母排序后连接成字符串,创建一个字典,将排序后的字符串映射到由其变位词组成的列表。
遍历字典中每个变位词组,对于每个词组中的每对单词,检查是否可以通过交换两个字母将一个单词转换为另一个单词,如果可以,则这两个单词构成换位对。
示例代码如下:
# 示例单词列表
word_list = ['deltas', 'desalt', 'lasted', 'salted', 'slated', 'staled','retainers', 'ternaries', 'generating', 'greatening','resmelts','smelters', 'termless']
# 生成变位词字典
anagram_dict = {}
for word in word_list:
sorted_word = ''.join(sorted(word))
if sorted_word not in anagram_dict:
anagram_dict[sorted_word] = []
anagram_dict[sorted_word].append(word)
# 查找换位对
def is_metathesis_pair(word1, word2):
if len(word1) != len(word2):
return False
diff_count = 0
diff_positions = []
for i in range(len(word1)):
if word1[i] != word2[i]:
diff_count += 1
diff_positions.append(i)
if diff_count == 2:
pos1, pos2 = diff_positions
if word1[pos1] == word2[pos2] and word1[pos2] == word2[pos1]:
return True
return False
metathesis_pairs = []
for anagrams in anagram_dict.values():
for i in range(len(anagrams)):
for j in range(i + 1, len(anagrams)):
if is_metathesis_pair(anagrams[i], anagrams[j]):
metathesis_pairs.append((anagrams[i], anagrams[j]))
print(metathesis_pairs)