2016-01-24 5 views
1

Я только что начал преподавать Python прошлой ночью через документацию Python, учебники и вопросы SO.Почему не вычисляются мои уникальные целые числа?

До сих пор я могу попросить пользователя открыть файл, открыть и прочитать файл, удалить все # и начать \ n в файле, прочитать каждую строку в массиве и подсчитать количество целых чисел в строке.

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

Вот код:

with open(filename, 'r') as file: 
    for line in file: 
     if line.strip() and not line.startswith("#"): 
      #calculate the number of integers per line 
      names_list.append(line) 
      #print "There are ", len(line.split()), " numbers on this line" 

      #print names_list 

      #calculate the number of unique integers 
      myset = set(names_list) 
      print myset 
      myset_count = len(myset) 
      print "unique:",myset_count 

Для дальнейшего объяснения:

names_list является:

['1 2 3 4 5 6 5 4 5\n', '14 62 48 14\n', '1 3 5 7 9\n', '123 456 789 1234 5678\n', '34 34 34 34 34\n', '1\n', '1 2 2 2 2 2 3 3 4 4 4 4 5 5 6 7 7 7 1 1\n'] 

и my_set является:

set(['1 2 3 4 5 6 5 4 5\n', '1 3 5 7 9\n', '34 34 34 34 34\n', '14 62 48 14\n', '1\n', '1 2 2 2 2 2 3 3 4 4 4 4 5 5 6 7 7 7 1 1\n', '123 456 789 1234 5678\n']) 

выход я получаю это :

unique: 1 
unique: 2 
unique: 3 
unique: 4 
unique: 5 
unique: 6 
unique: 7 

Вывод, который должен произойти в:

unique: 6 
unique: 3 
unique: 5 
unique: 5 
unique: 1 
unique: 1 
unique: 7 

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

ответ

3

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

Вот прокомментировал фикс:

with open(filename, 'r') as file: 
    for line in file: 
     if line.strip() and not line.startswith("#"): 
      numbers = line.split() # splits the string by whitespace and gives you a list 
      unique_numbers = set(numbers) # builds a set of the strings in numbers 
      print(len(unique_numbers)) # prints number of items in the set 

Обратите внимание, что мы используем в настоящее время обрабатывается линии и построить набор из него (после разделения линии). В исходном коде хранятся все строки, а затем создается набор из строк в каждом цикле.

+0

Благодарим вас за хорошее объяснение. Я сделал изменения, и все отлично работает. Я ценю это. –

2
myset = set(names_list) 

должен быть

myset = set(line.split()) 
+0

спасибо. Я ценю это. –

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