集合字典的交集
Intersection of dictionary of sets
所以我有一本字典,它是通过读取一个文件并为在该文件中找到的每个单词制作一个键,其值是该单词出现的一组行号。这是来自文件的字典示例。
{'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}}
我需要做的是将用户输入的 space 个分隔词(我制作成一个列表)并在字典中搜索它们所在的行的交集。例如,如果用户输入 "the" 那么它会 return 3, 4, 7 如果他们输入 "the is" 会 return 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()
我尝试的一切都保持 returning None。
假设 uinput
是 user-entered 个单词的列表,而 D
是您的字典,例如:
uinput = "the is".split()
然后你可以检查 uinput
,将每个单词用作字典键,获取它的值,最后取交集,正如你的问题标题所暗示的那样:
set.intersection(*[D[x] for x in uinput if x in D])
#{3, 7}
这就是问题所在:
if word not in D:
word_set = D[word]
应该是
if word in D:
word_set = D[word]
我认为问题出在行 if word not in D:
上。在那一行中,您确保 D
中 是 的任何输入都被推迟到 else
,从而返回 None
(我假设这个所有都发生在一个函数中,因为这是 return
语句唯一有意义的地方)。将其更改为 if word in D:
应该允许您继续调试。
所以我有一本字典,它是通过读取一个文件并为在该文件中找到的每个单词制作一个键,其值是该单词出现的一组行号。这是来自文件的字典示例。
{'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}}
我需要做的是将用户输入的 space 个分隔词(我制作成一个列表)并在字典中搜索它们所在的行的交集。例如,如果用户输入 "the" 那么它会 return 3, 4, 7 如果他们输入 "the is" 会 return 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()
我尝试的一切都保持 returning None。
假设 uinput
是 user-entered 个单词的列表,而 D
是您的字典,例如:
uinput = "the is".split()
然后你可以检查 uinput
,将每个单词用作字典键,获取它的值,最后取交集,正如你的问题标题所暗示的那样:
set.intersection(*[D[x] for x in uinput if x in D])
#{3, 7}
这就是问题所在:
if word not in D:
word_set = D[word]
应该是
if word in D:
word_set = D[word]
我认为问题出在行 if word not in D:
上。在那一行中,您确保 D
中 是 的任何输入都被推迟到 else
,从而返回 None
(我假设这个所有都发生在一个函数中,因为这是 return
语句唯一有意义的地方)。将其更改为 if word in D:
应该允许您继续调试。