0

输入:字符串列表['who are they','are you there?','Yes! you be there']

输出:一个字典,它将任何字符串中的每个单词映射到由包含该单词的所有字符串的 id 组成的集合。

output = {'who':[1], 'are':[1,2], 'they':[1], 'you':[2,3], 'there':[2], 'Yes':[3], 'be':[3]}

我被卡住了,请帮忙,我无法制定执行此功能的方法或程序。

4

3 回答 3

7

使用一个collections.defaultdict对象来收集你的 id 并enumerate()生成它们:

from collections import defaultdict

output = defaultdict(list)

for index, sentence in enumerate(inputlist):
    for word in sentence.lower().split():
         output[word.strip('!?. ')].append(index) 

请注意,我将句子小写并去掉所有剩余的标点符号。

结果:

defaultdict(<class 'list'>, {'are': [0, 1], 'they': [0], 'be': [2], 'who': [0], 'yes': [2], 'there': [1, 2], 'you': [1, 2]})

这使用基于 0 的索引(就像 Python 中的所有内容一样)。如果您必须从 1 开始计数,请告诉enumerate()从那里开始计数:

for index, sentence in enumerate(inputlist, 1):
于 2013-07-04T11:59:22.917 回答
1

我会这样解决这个问题:

def toDict(l):
    ids, output,i = {}, {},1
    for sentence in l:
        ids[sentence] = i
        i += 1
    for sentence in l:
        words = sentence.split(" ")
        for word in words:
            if word in output:
                output[word].append(ids[sentence])
            else:
                output[word] = []
                output[word].append(ids[sentence])
    return output

返回:

 {'be': [3], 'there': [3], 'who': [1], 'Yes!': [3], 'there?': [2], 'are': [1, 2], 'they': [1], 'you': [2, 3]}
于 2013-07-04T12:21:57.433 回答
0

这个有趣的解决方案怎么样:

import string
a = ['who are they','are you there?','Yes! you be there']
x ={}
for word in ' '.join(a).translate(None,string.punctuation).lower().split():
    try:x[word]+=1
    except:x[word]=1
print x
  • join() 字符串列表以形成一个字符串,因为您不关心单词的组织方式
  • translate() 删除标点符号
  • lower() 所有字符都小写,这样你就不会区别对待“是”和“是”
  • split() 将字符串拆分为单词
  • 在更长的 if 语句中尝试,除了和代码高尔夫
于 2013-07-04T12:44:41.590 回答