从列表中删除所有空格创建字典

时间:2016-07-25 00:04:50

标签: python dictionary

很抱歉,但我对这些事情有点新意。我正在从文本中分割单词并将它们放入dict为每个标记创建索引:

import re
f = open('/Users/Half_Pint_Boy/Desktop/sentenses.txt', 'r')

a=0
c=0
e=[]

for line in f:

    b=re.split('[^a-z]', line.lower()) 
    a+=len(list(filter(None, b)))
    c = c + 1
    e = e + b

d = dict(zip(e, range(len(e))))

但最后我收到一个带有空格的字典:

{'': 633,
 'a': 617,
 'according': 385,
 'adjacent': 237,
 'allow': 429,
 'allows': 459}

如何删除""从dict的最终结果?另外如何在此之后更改索引以不使用""在索引计数? (使用""索引计数为633,没有-248) 非常感谢!

3 个答案:

答案 0 :(得分:2)

这个怎么样?

b = list(filter(None, re.split('[^a-z]', line.lower())))

作为替代方案:

b = re.findall('[a-z]+', line.lower())

无论哪种方式,您都可以从下一行中删除filter

a += len(b)

修改

顺便说一句,我认为你最终得到的是一个字典,将单词映射到最后一个位置,在这些位置出现在文本中。我不确定这是不是你打算做什么。 E.g。

>>> dict(zip(['hello', 'world', 'hello', 'again'], range(4)))
{'world': 1, 'hello': 2, 'again': 3}

如果您想要跟踪所有单词出现的位置,请尝试使用此代码:

from collections import defaultdict
import re

indexes = defaultdict(list)

with open('test.txt', 'r') as f:
    for index, word in enumerate(re.findall(r'[a-z]+', f.read().lower())):
        indexes[word].append(index)

indexes然后将每个单词映射到单词出现的索引列表。

编辑2

根据下面的评论讨论,我想你想要更像这样的东西:

from collections import defaultdict
import re

word_positions = {}

with open('test.txt', 'r') as f:
    index = 0
    for word in re.findall(r'[a-z]+', f.read().lower()):
        if word not in word_positions:
            word_positions[word] = index
            index += 1

print(word_positions)

# Output:
# {'hello': 0, 'goodbye': 2, 'world': 1}

答案 1 :(得分:1)

替换:

d = dict(zip(e, range(len(e))))

使用:

d = {word:n for n, word in enumerate(e) if word}

或者,要首先避免空条目,请替换:

b=re.split('[^a-z]', line.lower()) 

使用:

b=re.split('[^a-z]+', re.sub('(^[^a-z]+|[^a-z]+$)', '', line.lower()))

答案 2 :(得分:1)

你的正则表达式看起来不是很好。考虑使用:

line = re.sub('[^a-z]*$', '', line.strip())
b = re.split('[^a-z]+', line.lower())