我有一个格式如下的文件:
"<POST N>
sentences
<POST N>
other sentences..."
其中N是POST的ID(数字不同,并且不总是1,2,3 ......)
我需要用这种格式创建一个字典:{word:set([IDs])}因为一些单词可能包含在多个帖子中,但我真的不明白如何为同一个单词分配多个数字。
这是代码,直到我陷入困境:
输出应该是:
{u&#39; word1:[set([ID])] u&#39; word2:[set([ID,ID ID])] &lt; ---如果该词包含在多个帖子中 ... }
PS。这里有什么功能&#34;字&#34;是的,但它与我的问题无关
def noalpha(s):
noa = ''
for c in s:
if not c.isalpha() and c not in noa:
noa += c
return noa
def words(s):
noa = noalpha(s)
for c in noa:
s = s.replace(c, ' ')
return s.split()
编辑:
感谢您的帮助(无论如何我决定不使用您的代码,因为我只是盯着研究python而且对我来说看起来太高级了),无论如何代码都没有完成,我再次陷入困境:
代码应该做的更多是,对于每个单词&#34; l&#34;,填写另一个集合dw,即如果len(iw)不是&lt; t&lt;&lt; t&lt;在那种情况下,如果&#34; l&#34;&#34;&#34; iw&#34;是该单词的一个子集,&#34; l&#34;的dw应填充该单词 例如:
u'replace': [set([]), set([1, 2, 4, 5])],
u'for': [set([u'replace']), set([1, 2, 4])]
有什么想法吗?
答案 0 :(得分:1)
问题在于这一部分,当它出现在多个帖子kk
中时,你会在内循环的每次迭代中覆盖单词s
的值。
for s in dizv:
for kk in dizv[s]:
dnew[kk] = set([s])
相反,您可以使用setdefault
创建新的set
(如果它已经不存在),否则只需add
即可。
dnew.setdefault(kk, set()).add(s)
此外,您可以使用正则表达式匹配<POST N>
行并查找单词,并使用defaultdict
使整个代码更紧凑:
with open("test.txt") as f:
index = collections.defaultdict(set)
num = None
for line in f:
m = re.match(r"<POST (\d+)", line)
if m is not None:
num = m.group(1)
else:
for word in re.findall(r"\w+", line):
index[word].add(num)