从字符串列表中删除重复项

时间:2015-07-26 06:52:27

标签: python list

我正在尝试读取文件,制作单词列表,然后创建一个新的单词列表,删除重复项。 我无法将这些字词附加到新列表中。它说没有任何类型的对象没有属性'追加'

以下是代码:

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

9 个答案:

答案 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,然后按字母顺序对其进行排序。

希望这有帮助!