在Python中将输入字母与字典匹配

0 投票
4 回答
965 浏览
提问于 2025-04-20 20:46

我正在尝试制作一个程序,这个程序可以从一个.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

撰写回答