分配" ID"转换为"帖子"

时间:2015-10-28 12:00:19

标签: python-2.7 dictionary

我有一个格式如下的文件:

"<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])]

有什么想法吗?

1 个答案:

答案 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)