Как избежать нетипов при объединении списков в Python - PullRequest
0 голосов
/ 17 апреля 2020

Я очень новичок в Python и ищу помощи в том, где я ошибаюсь с заданием. Я пытался по-разному подойти к проблеме, но продолжаю застрять в одной и той же точке (точках):

Проблема 1. Когда я пытаюсь создать список слов из файла, я продолжаю составлять список для количество слов в строке, а не во всем файле

Проблема 2: Когда я пытаюсь объединить списки, я получаю «Нет» за мой результат или ошибки нетипов [что, я думаю, означает, что я добавил «Нет» вместе (? )].

Назначение:

#8.4 Open the file romeo.txt and read it line by line. For each line, split the line into a list of words using the split() method. The program should build a list of words. For each word on each line check to see if the word is already in the list and if not append it to the list. When the program completes, sort and print the resulting words in alphabetical order.You can download the sample data at http://www.py4e.com/code3/romeo.txt

Мой текущий код, который дает мне ошибку, не связанную с типом:

poem = input("enter file:")
play = open(poem)
lst= list()
for line in play:
    line=line.rstrip()
    word=line.split()
    if not word in lst:
        lst= lst.append(word)
print(lst.sort())

Если бы кто-то мог просто рассказать мне, где я нахожусь идет не так, как надо!

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Проблема 1: Когда я пытаюсь создать список слов из файла, я продолжаю составлять список слов в строке, а не для всего файла

Вы делаете play = open(poem) затем for line in play: - это метод построчной обработки файла, если вы хотите обработать весь контент сразу, выполните:

play = open(poem)
content = play.read()
words = content.split()

Пожалуйста, не забывайте close файл после вас использовал его, т.е. сделать

play.close()

, если вы не используете способ управления контекстом (например, как with open(poem) as f:)

0 голосов
/ 17 апреля 2020

Просто чтобы помочь вам войти в Python немного больше:

Вы можете: 1. Читать весь файл сразу (если он большой, лучше захватить его в оперативную память, если у вас достаточно если вы не захватите столько, сколько можете, чтобы блок был разумным, то захватите еще один и т. д.) 2. Разделите данные, которые вы читаете, на слова и 3. Используйте set () или dict () для удаления дубликатов

Попутно вы не должны забывать обращать внимание на прописные и строчные буквы, если вам нужны одни и те же слова, а не просто разные не повторяющиеся строки

Это будет работать в Py2 и Py3 до тех пор, пока вы сделайте что-нибудь с функцией input () в Py2 или используйте кавычки при вводе пути, поэтому:

path = input("Filename: ")
f = open(filename)
c = f.read()
f.close()
words = set(x.lower() for x in c.split()) # This will make a set of lower case words, with no repetitions
# This equals to:
#words = set()
#for x in c.split():
#    words.add(x.lower())
# set() is an unordered datatype ignoring duplicate items
# and it mimics mathematical sets and their properties (unions, intersections, ...)
# it is also fast as hell.
# Checking a list() each time for existance of the word is slow as hell
#----
# OK, you need a sorted list, so:
words = sorted(words)
# Or step-by-step:
#words = list(words)
#words.sort()
# Now words is your list

Что касается ваших ошибок, не беспокойтесь, они встречаются в начале практически на любом объектно-ориентированном языке. Другие хорошо объяснили их в своих комментариях. Но не для того, чтобы ответа не хватало ...:

Всегда обращайте внимание на функции или методы, которые работают с типом данных (вместо них sort - list.sort (), list.append (), list.insert ( ), set.add () ...) и какие из них возвращают новую версию типа данных (sorted (), str.lower () ...). Если вы столкнулись с подобной ситуацией снова, используйте help () в интерактивной оболочке, чтобы увидеть, что именно выполняет функция.

>>> help(list.append)
>>> help(list.sort)
>>> help(str.lower)
>>> # Or any short documentation you need

Python, особенно Python 3.x, чувствителен к попыткам операции между типами, но некоторые могут иметь различную коннотацию и могут фактически работать, делая неожиданные вещи. Например, вы можете сделать:

print(40*"x")

Он напечатает 40 символов "x", потому что он создаст строку из 40 символов. Но:

print([1, 2, 3]+None)

логически не будет работать, что и происходит в остальной части вашего кода.

В некоторых языках, таких как javascript (ужасные вещи), это будет работать отлично:

v = "abc "+123+" def";

Вставка 123 без проблем в строку. Это полезно, но программный кошмар и бессмыслица с другого угла обзора.

Кроме того, в Py3 разумное предположение от Py2 о том, что вы можете смешивать строки в Юникоде и байтах, и что автоматическое приведение c будет выполнено, не держа. Т.е. это TypeError:

print(b"abc"+"def")

, потому что b "ab c" - это bytes (), а "def" (или u "def") - это str () в Py3 - что такое unicode () в Py2)

Наслаждайтесь Python, это лучшее!

0 голосов
/ 17 апреля 2020

ваша проблема была lst= lst.append(word) это возвращает None

with open(poem) as f:
    lines = f.read().split('\n') #you can also you readlines()

lst = []
for line in lines:
    words = line.split()
    for word in words:
        if word:
            lst.append(word)
...