将输入字母与Python中的字典进行匹配
问题描述:
我正在试图制作一个程序,该程序将读取.txt文件中的单词,并让用户输入自己选择的字母,程序将打印出所有匹配。将输入字母与Python中的字典进行匹配
这是我走到这一步:
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”,它会找到我“马”,但它也会找到我与两个“玫瑰”,因为它只比较元素,而不是金额
我怎样才能使程序到只有使用指定的字母?
答
您可以映射带有键的映射字典作为单词中的字母,并且值是该单词中出现的次数。 现在只需比较两个字典。
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
答
一种方法,你可以遵循的是使用一套fundtions:
要么使用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'])
在第二种方法,如果你有选择要在多个选项中进行选择,您可以选择较小的结果。
+0
这是他已经在做的事,用'> ='而不是'issuperset',但是因为重复的字母它不起作用。 – 2014-09-10 12:54:09
答
您可以使用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
答
Counters是你的朋友
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
您正在寻找anagrams。对单词中的字母进行排序,并且不要使用一套。例如。马 - > ehors,玫瑰 - > eorss。 – 2014-09-10 11:40:22
我不认为单独排序会做到这一点。看起来他正在寻找超级赛马,即“马匹”应该与“玫瑰”匹配。 – 2014-09-10 11:45:42
是的,对不起,该部分来源未翻译。现在编辑它。 @PeterWood我该怎么做?我想你的建议是反对这个词的每个字母的某种迭代? – SereneVirus 2014-09-10 11:46:16