Пересечение словаря множеств

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

{'we': {4}, 'created': {4}, 'into': {2}, 'cant': {6}, 'imagination': {3}, 'with': {4}, 'nature': {2}, 'genius': {7}, 'gravity': {6}, 'of': {1, 3, 5}, 'rather': {1}, 'has': {7}, 'difference': {7}, 'try': {1}, 'better': {2}, 'used': {4}, 'value': {1}, 'between': {7}, 'blame': {6}, 'problems': {4}, 'is': {3, 7}, 'everything': {2}, 'not': {1, 3}, 'to': {1}, 'intelligence': {3}, 'thinking': {4}, 'them': {4}, 'deep': {2}, 'become': {1}, 'falling': {6}, 'for': {6}, 'character': {5}, 'when': {4}, 'will': {2}, 'solve': {4}, 'limits': {7}, 'same': {4}, 'weakness': {5}, 'and': {2, 7}, 'but': {1, 3}, 'love': {6}, 'knowledge': {3}, 'understand': {2}, 'then': {2}, 'man': {1}, 'our': {4}, 'attitude': {5}, 'in': {6}, 'the': {3, 4, 7}, 'that': {7}, 'sign': {3}, 'look': {2}, 'stupidity': {7}, 'cannot': {4}, 'its': {7}, 'true': {3}, 'success': {1}, 'becomes': {5}, 'you': {2, 6}}

Что мне нужно сделать, так это взять введенные пользователем слова, разделенные пробелами (которые я сделал в списке), и найти в словаре пересечение строк, на которых они все находятся. Например, если пользователь вводит «the», он вернет 3, 4, 7, а если он введет «the is», вернет 3, 7.

Вот что я придумал до сих пор, просто пытаясь заставить его работать на 1 слово:

inp_lst = inp_str.strip().split()

print("The co-occurance for: " + ", ".join(inp_lst))


for word in inp_lst:

    word = word.strip().strip(string.punctuation).lower()\
        .replace("'","").replace("-","")

    if word in D: 
        word_set = D[word]

    else:
        return None


cooccurance_lst = list(word_set)

return cooccurance_lst.sort() 

И все, что я пытаюсь, возвращает None.


person Skyler Dyer    schedule 11.04.2017    source источник
comment
Ваша первая проблема связана со звонком inp_str.strip().split(). string.split(), вызванный без аргументов, разбивает строку на каждый символ, поэтому "the".split() возвращает ["t", "h", "e"]. Попробуйте исправить это в качестве первого шага.   -  person DW42    schedule 11.04.2017
comment
Чтобы уточнить, вы должны использовать inp_str.strip().split(" "), который разделит строку на каждый пробел, поведение, которое, как я полагаю, вам нужно.   -  person DW42    schedule 11.04.2017
comment
@DW42 Хм, >>> "the".split() -> ['the'], вы, наверное, думаете о list("the"). Если разделитель для str.split не указан, по умолчанию используется пробел.   -  person Steven Summers    schedule 11.04.2017
comment
Мои извинения; Я перепутал .split() и .split('') (которые сейчас могут обесцениться) не проверив.   -  person DW42    schedule 11.04.2017
comment
Еще одна вещь, которую следует учитывать, это то, что cooccurance_lst.sort() вернет None, поскольку вы сортируете на месте, вам нужно будет отсортировать, а затем вернуть или return sorted(cooccurance_lst)   -  person Steven Summers    schedule 11.04.2017
comment
@StevenSummers спасибо, это была еще одна большая проблема, с которой я столкнулся!!   -  person Skyler Dyer    schedule 11.04.2017


Ответы (3)


Предположим, что uinput — это список слов, введенных пользователем, а D — ваш словарь, например:

uinput = "the is".split()

Затем вы можете перейти к uinput, использовать каждое слово в качестве ключа словаря, получить его значение и, наконец, взять пересечение, точно так, как предполагает заголовок вашего вопроса:

set.intersection(*[D[x] for x in uinput if x in D])
#{3, 7}
person DYZ    schedule 11.04.2017
comment
Вероятно, вам нужен in чек. set.intersection(*(d[x] for x in uinput if x in d)) - person Steven Summers; 11.04.2017
comment
@StevenSummers Достаточно честно. - person DYZ; 11.04.2017
comment
что этот * здесь делает? - person NMN; 11.04.2017
comment
Мне потребовалось некоторое время, чтобы понять, что «D» - это название словаря, созданного OP. Он нигде не уточняет, что он делает? - person AkshayDandekar; 11.04.2017
comment
@Dandekar Нет, нет. - person DYZ; 11.04.2017
comment
Прошу прощения, наверное, надо было это указать. Этот ответ, похоже, дал мне то, что мне было нужно. Большое спасибо!! - person Skyler Dyer; 11.04.2017

это проблема :

 if word not in D: 
    word_set = D[word]

должно быть

if word in D: 
    word_set = D[word]
person Pushkr    schedule 11.04.2017

Думаю проблема в строке if word not in D:. В этой строке вы убедитесь, что любой ввод, который находится в D, откладывается до else, тем самым возвращая None (я предполагаю, что все это происходит внутри функции, так как это единственное место, где return операторы имеет смысл). Изменение его на if word in D: должно позволить вам продолжить отладку.

person DW42    schedule 11.04.2017
comment
Да, я исправил это в вопросе. Первоначально у меня было то, что если еще было в обратном порядке, думая, что это может помочь, но это не помогло, поэтому я изменил его обратно. Спасибо. - person Skyler Dyer; 11.04.2017
comment
Кроме того, ответ @DYZ кажется подходящим. - person DW42; 11.04.2017