2016-01-02 16 views
-2

Я хочу построить список слов. Для каждого слова в каждой строке проверьте, есть ли слово в списке, и если оно не добавлено в список. Когда программа завершается, сортируйте и распечатайте полученные слова в алфавитном порядке. Но когда я добавляю строку в список, она показывает, что «аргумент типа« NoneType »не является итерируемым». Что 'беспокоиться?Python: аргумент типа «NoneType» не итерируется

fh = ("But soft what light through yonder window breaks" 
    "It is the east and Juliet is the sun" 
    "Arise fair sun and kill the envious moon" 
    "Who is already sick and pale with grief") 
    lst = list() 
    for line in fh: 
     words = line.split() 
     for word in line: 
       if word not in lst: 
        lst = lst.append(word) 
    lst.sort() 
    print lst 
+2

1) Попробуйте распечатать 'fh'; это не то, что вы думаете. 2) Почему вы выполняете 'words = line.split()', а затем ничего не делаете с 'словами'? Является ли 'слово в строке:' должно быть 'слово за слова:'? 3) Что вы ожидаете от lst = lst.append (word) '? 4) Чтобы сделать это эффективно, вы должны использовать ['set'] (https://docs.python.org/2/library/stdtypes.html#set-types-set-frozenset). –

ответ

1

Ну fh это одна строка, и питон не будет знать, как разделить его на линии, как вы хотите. Вы должны попробовать добавить запятые (или тройные кавычки, т.е. """):

fh = ("But soft what light through yonder window breaks", 
    "It is the east and Juliet is the sun", 
    "Arise fair sun and kill the envious moon", 
    "Who is already sick and pale with grief") 

, который позволит вам получить:

>>> fh 
('But soft what light through yonder window breaks', 
'It is the east and Juliet is the sun', 
'Arise fair sun and kill the envious moon', 
'Who is already sick and pale with grief') 

После этого, вы можете использовать for line in fh правильно, и тогда вы будете вероятно, хотите использовать for word in words вместо for word in line, что здесь не имеет большого смысла. Это позволит вам перебирать все слова каждой строки в тексте.

Кроме того, .append() возвращается None (это изменение списка в месте), поэтому назначение его переменной бесполезно в этом случае. Поэтому, чтобы исправить это, вы должны, вероятно, создать список и использовать .append().

Кроме того, говорящий вообще lst = lst.append(word) не имеет никакого смысла (даже если он «работал»), что вы пытаетесь сделать с этим?

2

Когда вы кладете два строковых литералов рядом друг с другом, вы получаете одну строку:

>>> 'hi' 'there' 
'hithere' 

пробельных между ними не влияет на это. Это означает, что for line in fh: выполняет итерацию по каждому символу , не каждая строка, создавая неожиданные результаты. У вас есть несколько вариантов исправить это.

С тройным кавычками и splitlines():

fh = ("""But soft what light through yonder window breaks 
It is the east and Juliet is the sun 
Arise fair sun and kill the envious moon 
Who is already sick and pale with grief""") 
fh = fh.splitlines() 

Результат:

>>> fh[0] 
'But soft what light through yonder window breaks' 

Или с list или tuple:

fh = ("But soft what light through yonder window breaks", 
"It is the east and Juliet is the sun", 
"Arise fair sun and kill the envious moon", 
"Who is already sick and pale with grief") 

Результат:

>>> fh[0] 
'But soft what light through yonder window breaks' 

Затем вы получите split() линию и сохраните ее, но вы забыли ее использовать. for word in line: должно быть for word in words: для итерации над новым объектом. В качестве альтернативы вы можете сохранить эту строку одинаково и вместо этого изменить линию над ней (words = line.split()) до line = line.split().

Тогда у вас есть еще одна проблема: append() выполняет свою операцию на месте и возвращает None.Это означает, что вы просто вызываете этот метод, и он будет делать то, что он говорит, без необходимости переназначения ссылки. Если вы это сделаете, lst быстро укажет на None, и вы этого не захотите. Вместо этого:

lst.append(word) 
+0

Это появляется в конце этого ответа. – TigerhawkT3

0

Я постараюсь вам помочь.

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

Во-вторых, эта проблема уже решена с большим количеством хороших объяснений в Интернете. Проверьте, например. item frequency count in python, который имеет фантастическое количество умных решений.

В-третьих, это, возможно, та часть, которую вы ожидали, и ваш вопрос показывает, что вам нужно улучшить понимание синтаксиса, функциональности и общего алгоритмического мышления Python. Позвольте мне уточнить.

Python Синтаксис и функциональность

Многие другие ответы подчеркнуть, что, как вы используете fh не очень хорошо. Как правило, вы бы многострочный строку написанную, как это в Python:

fh = '''this is the first row 
second row 
third row''' 

Другие известные примеры того, где вы получили бы от того лучшего понимания синтаксиса и функциональности Python является, например, список, встроенные типы и т. д. Пройдите через Python tutorial. Прикопайтесь к нему, это очень полезно!

алгоритмическое мышление

Обычно, когда я вижу код, такой как ваша, я пытаюсь выяснить, если проблема заключается в отсутствии понимания/знания инструмента (в данном случае Python) или решения сам. В вашем случае, я думаю, что это немного.

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

Я бы решил проблему, используя набор, используя набор данных для решения этой проблемы. Наборы довольно удобны в большинстве случаев и хорошо описаны в области дискретной математики. Ознакомьтесь с книгой Discrete Mathematics and Its Applications от Rosen, которая охватывает это и целую кучу других вещей, которые вы найдете полезными в будущем. (Вы можете, вероятно, найти много интернет-ресурсов, описывающих наборы, но эта книга ссылка на области дискретной математики. Я рекомендую получить его.)

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

Возможное решение

Итак, что может стать возможным решением выглядеть?Я бы сделал следующее:

  1. Убедитесь, что все в многострочной строке.
  2. Разделить строку в список.
  3. Создайте набор, основанный на содержимом списка.
  4. Преобразуйте обратно в список, чтобы его можно было отсортировать.
  5. Сортировка.
  6. Печать.

Все это не требует каких-либо for или if заявления, и использует много функциональных возможностей встроенного языка.

Надеюсь, что этот совет поможет вам!

Смежные вопросы