我正在尝试读取文件,制作单词列表,然后创建一个新的单词列表,删除重复项。 我无法将这些字词附加到新列表中。它说没有任何类型的对象没有属性'追加'
以下是代码:
fh = open("gdgf.txt")
lst = list()
file = fh.read()
for line in fh:
line = line.rstrip()
file = file.split()
for word in file:
if word in lst:
continue
lst = lst.append(word)
print lst
答案 0 :(得分:3)
python None
将返回set
。因此In [102]: mylist = ["aa","bb","cc","aa"]
In [103]: list(set(mylist))
Out[103]: ['aa', 'cc', 'bb']
将有助于删除重复项。
file = fh.read()
希望这有帮助
在你的情况下
fh
此file
之后将是一个空的生成器。所以你不能使用它,因为它已经被使用了。你必须用变量$pages = get_pages();
foreach ($pages as $page_data) {
$content = apply_filters('the_content', $page_data->post_content);
$title = $page_data->post_title;
echo $content;
}
进行操作
答案 1 :(得分:1)
append
就地附加一个项目,这意味着它不会返回任何值。在追加lst=
时,您应该摆脱word
:
if word in lst:
continue
lst.append(word)
答案 2 :(得分:1)
您正在使用append
函数的返回值替换列表,而lst.append(word)
函数不是列表。只需这样做:
width: 100vw
答案 3 :(得分:1)
list.append()
就地附加,它返回None
(因为它不会返回任何内容)。所以你不需要将list.append()
的返回值设置回列表。只需将行lst=lst.append(word)
更改为 -
lst.append(word)
另一个问题是,您首先在文件上调用.read()
然后迭代它的行,您不需要这样做。只需删除迭代部分。
此外,如果您对元素的顺序不感兴趣,则删除重复项的简便方法是使用set。
示例 -
>>> lst = [1,2,3,4,1,1,2,3]
>>> set(lst)
{1, 2, 3, 4}
因此,在您的情况下,您可以将lst
初始化为 - lst=set()
。然后使用lst.add()
元素,您甚至不需要检查元素是否已存在。最后,如果您确实希望将结果作为列表,请执行 - list(lst)
,将其转换为列表。 (虽然在执行此操作时,您希望考虑将变量重命名为更好的内容,以便更容易理解其set
而不是list
)
答案 4 :(得分:1)
append
修改调用它的列表,然后返回None
。即,你应该替换这一行:
lst=lst.append(word)
只需
lst.append(word)
答案 5 :(得分:1)
fh=open("gdgf.txt")
file=fh.read()
for line in fh:
line=line.rstrip()
lst = []
file=file.split()
for word in file:
lst.append(word)
print (set(lst))
答案 6 :(得分:0)
append()
不返回任何内容,因此不要分配它。 lst.append()
是
够了。
修改后的代码:
fh = open("gdgf.txt")
lst = []
file=fh.read()
for line in fh:
line = line.rstrip()
file=file.split()
for word in file:
if word in lst:
continue
lst.append(word)
print lst
我建议您使用 set()
,因为它用于 唯一元素的无序集合。
fh = open("gdgf.txt")
lst = []
file = fh.read()
for line in fh:
line = line.rstrip()
file = file.split()
lst = list( set(lst) )
print lst
答案 7 :(得分:0)
您可以通过直接读取和添加单词来简化代码。集合不允许重复,因此您将只留下唯一的单词:
words = set()
with open('gdgf.txt') as f:
for line in f:
for word in line.strip():
words.add(word.strip())
print(words)
上述逻辑的问题是,以标点符号结尾的单词将被视为单独的单词:
>>> s = "Hello? Hello should only be twice in the list"
>>> set(s.split())
set(['be', 'twice', 'list', 'should', 'Hello?', 'only', 'in', 'the', 'Hello'])
您可以看到自己有Hello?
和Hello
。
您可以使用正则表达式提取单词来增强上面的代码,这将处理标点符号:
>>> set(re.findall(r"(\w[\w']*\w|\w)", s))
set(['be', 'list', 'should', 'twice', 'only', 'in', 'the', 'Hello'])
现在你的代码是:
import re
with open('gdgf.txt') as f:
words = set(re.findall(r"(\w[\w']*\w|\w)", f.read(), re.M))
print(words)
即使有上述内容,您也会有Word
重复,word
将被计算两次。如果要存储每个单词的单个版本,可以进一步增强它。
答案 8 :(得分:0)
我认为这个问题的解决方案可以更简洁:
import string
with open("gdgf.txt") as fh:
word_set = set()
for line in fh:
line = line.split()
for word in line:
# For each character in string.punctuation, iterate and remove
# from the word by replacing with '', an empty string
for char in string.punctuation:
word = word.replace(char, '')
# Add the word to the set
word_set.add(word)
word_list = list(word_set)
# Sort the set to be fastidious.
word_list.sort()
print(word_list)

通过" split"计算单词的一件事是你在分裂空白,所以这将使"单词" "Hello!"
和"Really?"
之类的词语将包括标点符号,这可能不是您想要的。
您的变量名称可能更具描述性,您的缩进似乎有点偏离,但我认为这可能是切入/粘贴到帖子中的问题。我试图根据我正在与之交互的逻辑结构(文件,行,单词,字符等)命名我使用的变量。
要查看' string.punctuation'的内容您可以启动iPython,导入字符串,然后只需输入string.punctuation
即可查看内容是什么。
还不清楚您是否需要拥有列表,或者您是否只需要包含唯一字词列表的数据结构。已正确创建以避免重复的集合或列表应该可以解决问题。继续问题之后,我使用set
来唯一地存储元素,然后将set
转换为list
,然后按字母顺序对其进行排序。
希望这有帮助!