2014-09-10 51 views
0

我正在试图制作一个程序,该程序将读取.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”,它会找到我“马”,但它也会找到我与两个“玫瑰”,因为它只比较元素,而不是金额

我怎样才能使程序到只有使用指定的字母?

+1

您正在寻找anagrams。对单词中的字母进行排序,并且不要使用一套。例如。马 - > ehors,玫瑰 - > eorss。 – 2014-09-10 11:40:22

+0

我不认为单独排序会做到这一点。看起来他正在寻找超级赛马,即“马匹”应该与“玫瑰”匹配。 – 2014-09-10 11:45:42

+0

是的,对不起,该部分来源未翻译。现在编辑它。 @PeterWood我该怎么做?我想你的建议是反对这个词的每个字母的某种迭代? – SereneVirus 2014-09-10 11:46:16

回答

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

一种方法,你可以遵循的是使用一套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

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 
1

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 
相关问题