在Python中将输入字母与字典匹配
我正在尝试制作一个程序,这个程序可以从一个.txt文件中读取单词,然后让用户输入自己选择的字母,最后程序会打印出所有匹配的单词。
这是我目前的进展:
fil = open("example.txt", "r")
words = fil.readlines()
letters = raw_input("Type in letters: ")
compare = set(letters)
lista = []
for a_line in words:
a_line = a_line.strip()
lineword = set(a_line)
if compare >= lineword:
lista.append(rad)
print lista
现在这个程序只能做到一定程度的匹配。它可以把用户输入的内容和.txt文件里的内容进行比较,但我希望它能更精确一些。例如:如果我输入“hrose”,它会找到“horse”,但同时也会找到“roses”,因为它只比较字母,而不考虑字母的数量。
我该如何让这个程序仅仅使用指定的字母呢?
4 个回答
0
你可以创建一个字典,用字母作为键,字母在单词中出现的次数作为值。这样就能知道每个字母出现了多少次。接下来,只需要比较这两个字典就可以了。
fil = open("example.txt", "r")
words = fil.readlines()
letters = raw_input("Type in letters: ")
compare = list(letters)
letter_dict = {}
for letter in compare:
try:
letter_dict[letter] += 1
except KeyError:
letter_dict[letter] = 0
lista = []
for a_line in words:
a_line = a_line.strip()
lineword = list(a_line)
word_dict = {}
for letter in lineword:
try:
word_dict[letter] += 1
except KeyError:
word_dict[letter] = 0
flag = True
for key, value in letter_dict.items():
if key not in word_dict or word_dict[key] < value:
flag = False
break;
if flag:
lista.append(a_line)
print lista
0
你可以尝试一种方法,就是使用集合的功能:
可以用 issubset/issuperset
set("horse").issubset(set("hrose")) #returs True
set("horse").issubset(set("roses")) #returns False
或者
set("horse").difference(set("hrose")) #returns empty set based on set length you know close call
set("horse").difference(set("roses")) #returns set(['h'])
在第二种方法中,如果你可以在多个选项中选择,你可以选择长度较小的结果。
1
计数器是你的好帮手
from collections import Counter
fil = open("example.txt", "r")
words = [(a.strip(), Counter(a.strip())) for a in fil.readlines()]
letters = raw_input("Type in letters: ")
letter_count = Counter(letters)
word_list = []
for word, word_count in words:
if all([letter_count[char] >= word_count[char] for char in word]):
word_list.append(word)
print word_list
从评论来看,你可能只想要完全匹配的结果,如果是这样的话,你甚至不需要用到计数器。
fil = open("example.txt", "r")
words = [(a.strip(), sorted(a.strip())) for a in fil.readlines()]
letters = sorted(raw_input("Type in letters: "))
word_list = [word for word, sorted_word in words if letters == sorted_word]
print word_list
1
你可以使用 Counter
这个工具:
from collections import Counter
def compare(query, word):
query_count = Counter(query)
word_count = Counter(word)
return all([query_count[char] >= word_count[char] for char in word])
>>> compare("hrose", "rose")
True
>>> compare("hrose", "roses")
False