Python словарь - PullRequest
       11

Python словарь

2 голосов
/ 19 сентября 2011

Я хотел бы сравнить введенные буквы (словарь) со списком (текстовый файл со словами) и распечатать слова, соответствующие введенным буквам.Что я сделал не так? (Я знаю, что у меня есть функция печати ДА или НЕТ, только если она находит подходящее слово в данный момент. Каков лучший способ создать эту функцию?).

def ordlista(list):
    fil = open("ord.txt", "r")
    words = fil.readlines()

    list = []

    for w in words:
        w = w.strip()
        list.append(w)
    return list


chars = {}
word = raw_input("Write 9 letters: ")

for w in word:
    w = w.lower()
    if w not in chars:
        chars[w] = 1
    else:
        chars[w] += 1


if chars.keys() in ordlista(list):
    print "YES"
else:
    print "NO"

Ответы [ 3 ]

2 голосов
/ 19 сентября 2011

chars.keys() - это список, поэтому

chars.keys() in ordlista(list):

никогда не будет Истиной. То, что вы хотите, - это совпадение букв с каждым словом в вашем списке. Поэтому я бы предложил

charsum = sum(chars.values())
for word in wordlist:
    if len(word) == charsum and all([(word.count(c) == chars[c]) for c in chars]):
        print "YES for word '%s'" % word

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы слова соответствовали тем, у которых не менее , то буква считается (то есть слово с 3 а будет соответствовать вводу двух а), тогда вам придется изменить == до >=.

РЕДАКТИРОВАТЬ2: Поскольку вам нужны точные совпадения, самым простым решением будет подсчитать количество символов и убедиться, что слово имеет такую ​​длину.

2 голосов
/ 19 сентября 2011

Вы проверяете наличие всего списка ключей в вашем списке символов, а не проверяете для каждого ключа в отдельности.Вы должны перебирать свои ключи индивидуально, а затем проверять их наличие.

for k in chars:
    if k in ordlista(list):
        print "YES"
    else:
        print "NO"

Если вы хотите напечатать слова, состоящие исключительно из букв в вашем списке символов, вы можете использовать следующий подход.

for word in ordlista(list):
    if not filter(lambda char: char not in chars, word):
        print word
1 голос
/ 19 сентября 2011

Использовать устанавливает :

chars = set(raw_input("Write 9 letters: "))

for word in ordlista(None):
    if(set(word) == chars):
        print "YES for '%s'" % word

Кстати, аргумент list - ordlista не нужен, так как он не используется.Я также не рекомендовал бы использовать имя list в целом, потому что оно скрывает встроенное <type 'list'>

Обновление : я прочитал ваш комментарий к сообщению jellybean.Если каждая буква может использоваться только один раз, вы, очевидно, не можете использовать наборы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...