2016-11-11 3 views
0

Я пытаюсь заполнить рабочий лист, но снова застрял. Мне нужно сохранить все комментарии Mooneye Studios в списке, который обновляется каждый раз, когда появляется новый комментарий от создателя проекта. Я пытаюсь сделать это с помощью первых двух условий в цикле for. Я получаю moon = [\ n, \ n, \ n ....]. Любая идея, как действовать и делать эту работу? Файл выглядит следующим образом: http://imgur.com/bsSr06q.Создание списка из .txt с использованием цикла for

comments = open('lostEmberComments.txt', 'r') 
nbOfCom = 0 #counting the commentaries 
people = []# list of ppl who have commented 
creator = False # did the creator write the comment? 
moon = [] # lists of comments made by the creator 
temp= '' 

for line in comments: 
    # my attempt 
    if '>>> Mooneye Studios' in line: 
    creator = True 
    if creator and '>>>' not in line: 
    temp += line 


    if '>>>' and 'Mooneye Studios' not in line: 
    creator = False 
     if temp != '': 
     moon.append(temp) 
     temp = '' 

    # this section is for the first part of the excercise 
    if '>>>' in line: 
     nbOfCom += 1 # counting the commentaries 
     if not line.rstrip('\n') in people: # avoiding duplicates 
     people.append(line.rstrip('\n')) 


b = len(people) 

print(moon) 
print('Discussion participants: ', people) 
print('There are ', b, 'contributors to the discussion.') 
print('There are ',nbOfCom,' commentaries on this project.') 

comments.close() 
+0

\ п является новой строки в Linux, и можно использовать line.replace («\ п», «») – Wonka

+0

Предполагается, что если творец в строке и >>> не в строке. –

+0

Я не считаю следующее условие: 'if '>>>' и 'Mooneye Studios' не в строке:' делает то, что вы, возможно, думаете, что это делает. Я полагаю, вы имеете в виду 'if '>>>' не в строке, а 'Mooneye Studios' не в строке' –

ответ

0

Проблема не на первые два если заявления, но на третьем если заявление, потому что первая часть ('>>>') из третье утверждение if всегда верно. Затем он сохранит только первую пустую строку комментария создателя с помощью второго оператора if. Изменение, упомянутое @juanpa, if '>>>' in line and 'Mooneye Studios' not in line, может решить проблему.

Существует еще одна проблема вашего кода: если последний комментарий в файле принадлежит создателю, он не будет сохранен в moon[].

Ниже мое предложенное решение:

nbOfCom = 0 
people = [] 
creator = False 
moon = [] 
temp = '' 

with open('lostEmberComments.txt') as comments: 
    for line in comments: 
     if line.startswith('>>> '): # start of new comment 
      nbOfCom += 1 
      if temp and creator: # previous comment is from creator 
       moon.append(temp) 
       temp = '' 
      commenter = line.rstrip()[4:] # get the commenter's name 
      creator = 'Mooneye Studios' == commenter 
      if commenter not in people: 
       people.append(commenter) 
     elif creator: 
      temp += line # save creator's comment 

# don't miss the last comment in file if it is from creator 
if temp and creator: 
    moon.append(temp) 

print(moon) 
print('Discussion participants:', people) 
print('There are', len(people), 'contributors to the discussion.') 
print('There are', nbOfCom, 'commentaries on this project.') 
0

Во-первых, if не то же самое, как elif для условий после первого. Во втором случае вы пройдете только по одной ветви, в первом случае вы пройдете по всем ветвям, где условие истинно.

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

Наконец, когда вы не получите ожидаемых результатов и не понимаете, почему, просто добавьте трассировку в свой код, чтобы легко следовать тем, какие строки действительно выполнялись, или же использовать режим отладки Python.

Ваш текущий код может стать (более или менее):

with open('lostEmberComments.txt', 'r') as comments: 
    nbOfCom = 0 
    people = [] 
    moon = [] 
    tmp = '' 
    for line in comments: 
     if line.startswith('>>>'): # start of a new comment 
      nbOfCom += 1   # count it 
      if (len(tmp.strip()) != 0) and creator: # was previous a creator's one 
       moon.append(tmp) # store it 
      tmp = '' 
      if 'Mooneye Studios' in line: # process current comment 
       creator = True 
      else: 
       creator = False 
       line = line.rstrip()  # not a creator's one 
       if not line in people:  # add the name if is does not already exists 
        people.append(line) 
     elif creator: 
      tmp += line    # a continuing line of a creator's comment 

# print the results 
... 
Смежные вопросы