словарь Python, ведение подсчета целых чисел - PullRequest
3 голосов
/ 19 июля 2010

Я пытаюсь посчитать список, скажем, целых чисел.У меня есть список чисел в файле CSV, в котором я могу прочитать, который выглядит примерно как 4 245 344 99 340, ... То, что я делаю, пытаюсь вернуть это словарь с парами ключ: значение, где ключцелочисленное значение из файла csv, а это число раз, которое оно появляется в списке.Я не уверен, что я делаю здесь неправильно, любая помощь будет оценена

allCounts = dict()

rows = csv.reader(open('...csv'), delimiter=',')

    for intValue in rows:
        intVal = intValue[0]

        for intVal, numAppearances in allCounts:
             if intVal in allCounts:
                allCounts[numAppearances] = allCounts[numAppearances]+1
             else:
                allCounts[numAppearances] = 1

Ответы [ 3 ]

8 голосов
/ 19 июля 2010

Похоже, что вы хотите, это объект Counter:
http://docs.python.org/library/collections.html#counter-objects

Также я думаю, что вы можете использовать модуль CSV:
http://docs.python.org/library/csv.html

Использованиевстроенные модули должны сделать это намного проще:)

Чтобы получить строки, примерно так должно работать:

csvfile = open("example.csv")
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)

Тогда вы сможете сделать это:

c = Counter(reader)
5 голосов
/ 19 июля 2010

То, что вы делаете, это итерация по всему диктату для каждой ячейки, что немного странно и, вероятно, не то, что вы хотите сделать. То, что вы действительно хотите сделать, это просто посмотреть в диктовку и увеличить ключ. Итак:

# first part stays mostly the same
rows = csv.reader(open("...csv") )

allCounts = {} 

for row in rows:
    for field in row:
        allCounts[field] = allCounts.get(field, 0) + 1

В последней строке используется небольшая функция dict, которая возвращает значение по умолчанию, если ключ не найден.

В вашем собственном коде есть некоторые заметные недостатки. Наиболее значимой является четвертая и пятая строки. Вы извлекаете первое поле из выбранной строки и присваиваете ему intVal, но затем полностью маскируете intVal, используя его в качестве ключа при итерации по вашему dict. это означает, что это задание не работает вообще.

Предложение if обречено. Вы проверяете, есть ли ключ в dict, но вы придумали этот ключ, перебирая ключи из того же самого dict. Конечно, этот ключ в диктате.

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

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

Файл CSV всегда структурирован как список значений (обычно разделенных запятыми), которые образуют строки, а строки разделяются символами новой строки. модуль CSV сохраняет это представление, возвращая список списков. Чтобы перейти к фактическим значениям, необходимо выполнить итерацию по каждой строке, а затем по каждому полю в этой строке. Ваш код перебирает каждую строку, а затем каждый ключ в dict для каждой строки, игнорируя поля.

0 голосов
/ 19 июля 2010

Избавьтесь от intVal = intValue[0]

Поскольку intValue является строкой, вы будете первым символом в строковом представлении числа.Что вам действительно нужно, так это intValue = int(intValue).

Тогда ваша логика полностью неверна - в настоящее время allCounts инициализируется в пустой словарь, который вы не можете перебрать.То, что вы хотите сделать, это перебрать значения, возвращаемые csv.reader, который вы уже есть.Оттуда ваша логика близка - к сожалению, это не подковы и не ручные гранаты.То, что вы хотите, это:

# Checks to see if intValue is a key in the dictionary
if intValue in allCounts:
    # If it is then we want to increment the current value
    # += 1 is the idiomatic way to do this
    allCounts[intValue] += 1
else:
    # If it is not a key, then make it a key with a value of 1
    allCounts[intValue] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...