Лучший способ подсчета уникальных значений из CSV в Python?

#python

#python

Вопрос:

Мне нужен быстрый способ подсчета уникальных значений из CSV (это действительно большой файл (> 100 МБ), который нельзя открыть, например, в Excel), и я подумал о создании скрипта Python.

CSV выглядит так:

 431231
3412123
321231
1234321
12312431
634534
  

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

6

Пока это то, что у меня есть:

 import csv
input_file = open(r'C:UsersguillDownloadsuu.csv')
csv_reader = csv.reader(input_file, delimiter=',')
thisdict = {
  "UserId": 1
}

for row in csv_reader:
    if row[0] not in thisdict:
        thisdict[row[0]] = 1

print(len(thisdict)-1)
  

Кажется, работает нормально, но мне интересно, есть ли лучший / более эффективный / элегантный способ сделать это?

Комментарии:

1. да. используйте set вместо dict .

2. Если файл состоит исключительно из чисел, как вы показали, что такое UserId ?

3. @AbhijitSarkar, ты можешь это проигнорировать. Раньше в файле был ‘userId’ в качестве заголовка, но его больше нет, поэтому он унаследован. Я удалю это, чтобы избежать путаницы. Вот почему на выходе также есть -1.

4. print(len(set(open('path/to/file.csv')))) должно сработать. Он выводит количество уникальных строк в файле. Он также экономит память, поскольку не читает все сразу, а вместо этого читает файл построчно и добавляет текущую строку в набор.

5. @yosukesabai Волшебный однострочник хорош для людей, которые знают, как это сделать. Обычно они не являются хорошим решением для людей, которым нужно запрашивать решения. Вот почему я оставил это в качестве комментария. Пошаговые решения помогают неопытным пользователям гораздо больше.

Ответ №1:

Набор больше подходит для этой проблемы, чем словарь:

 with open(r'C:UsersguillDownloadsuu.csv') as f:
    input_file = f

csv_reader = csv.reader(f, delimiter=',')
uniqueIds = set()

for row in csv_reader:
    uniqueIds.add(row[0])

print(len(uniqueIds))
  

Ответ №2:

используйте set вместо dict , вот так

 import csv
input_file = open(r'C:UsersguillDownloadsuu.csv')
csv_reader = csv.reader(input_file, delimiter=',')
aa = set()
for row in csv_reader:
    aa.add(row[0])
print(len(aa))