WedX - журнал о программировании и компьютерных науках

Преобразовать CSV в словарь с несколькими значениями?

У меня есть такой файл csv:

pos,place
6696,266835
6698,266835
938,176299
940,176299
941,176299
947,176299
948,176299
949,176299
950,176299
951,176299
770,272944
2751,190650
2752,190650
2753,190650

Я хочу преобразовать его в словарь следующим образом:

{266835:[6696,6698],176299:[938,940,941,947,948,949,950,951],190650:[2751,2752,2753]}

А затем заполните недостающие числа в диапазоне значений:

{{266835:[6696,6697,6698],176299:[938,939,940,941,942,943,944,945,946947,948,949,950,951],190650:[2751,2752,2753]}
}

Прямо сейчас я попытался создать словарь, используя решение, предложенное здесь, но он перезаписывает старое значение новым.

Любая помощь будет здорово.

Вот функция, которую я написал для преобразования csv2dict

def csv2dict(filename):
"""
reads in a two column csv file, and the converts it into dictionary
"""
import csv
with open(filename) as f:
    f.readline()#ignore first line
    reader=csv.reader(f,delimiter=',')
    mydict=dict((rows[1],rows[0]) for rows in reader)
return mydict   

  • Посмотрите на csv.DictReader. Я бы привел пример, но я никогда не использовал его сам, поэтому я тоже буду изучать документы! Алгоритмически это, безусловно, возможно, но я думаю, что csv.DictReader сделает за вас всю тяжелую работу. 04.03.2014
  • Я добавил функцию, которую я написал для преобразования cdv в словарь. 04.03.2014
  • Что со вторым набором брекетов, или это ошибка? Что касается заполнения значения, вы можете получить минимум и максимум конечных точек и просто создать диапазон для каждой (не обращая внимания на промежуточные значения). 04.03.2014
  • второй набор фигурных скобок был добавлен редактором... не знаю, почему. 04.03.2014

Ответы:


1

Проще всего использовать collections.defaultdict() со списком:

import csv
from collections import defaultdict

data = defaultdict(list)

with open(inputfilename, 'rb') as infh:
    reader = csv.reader(infh)
    next(reader, None)  # skip the header

    for col1, col2 in reader:
        data[col2].append(int(col1))
        if len(data[col2]) > 1:
            data[col2] = range(min(data[col2]), max(data[col2]) + 1)

Это также расширяет диапазоны на лету, когда вы читаете данные.

04.03.2014
  • Каковы преимущества расширения списка до диапазона во время чтения по сравнению с однократным просмотром каждого ключа после его чтения? 04.03.2014
  • @adsmith: на самом деле не так уж много преимуществ, но здесь это упростило код. 04.03.2014
  • БЛАГОДАРЮ ВАС. это сработало, мне пришлось изменить последнюю строку, чтобы преобразовать строки в списке в целое число. данные [col2] = диапазон (мин (карта (int, данные [col2])), макс (карта (int, данные [col2])) + 1) 04.03.2014
  • @msakya: ах, конечно. Вместо этого я изменил другую строку, чтобы превратить col1 в целое число. 04.03.2014
  • @MartijnPieters в примечании: возможно ли расширить только выбранный диапазон значений. Например, если значения имели [2,8,10,500,502], расширьте их только как [2,3,4,5,6,7,8,9,10,501,502], а не все числа от 10 до 501. В основном используйте порог для расширять. 04.03.2014
  • @msakya: конечно, еще немного логики; но это будет отдельный вопрос, я бы сказал. 04.03.2014
  • @MartijnPieters: Спасибо. на самом деле опубликовал новый вопрос сейчас:) здесь< /а> 04.03.2014

  • 2

    Основываясь на том, что вы пробовали -

    from collections import default dict
    
    # open archive reader
    myFile = open ("myfile.csv","rb")
    archive = csv.reader(myFile, delimiter=',')
    arch_dict = defaultdict(list)
    
    for rows in archive: 
        arch_dict[row[1]].append(row[0])
    
    print arch_dict 
    
    04.03.2014
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]