запись словаря с одним ключом и двумя значениями в CSV-файл - PullRequest
0 голосов
/ 08 февраля 2019

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

sorted_combined = sorted(combined.items(), key = lambda kv: kv[1][1])
with open('output.csv', 'wb') as output:
   writer = csv.writer(output)
   writer.writerow(["Subject", "Sij", "gij"])
for key, value in sorted_combined.iteritems():
   writer.writerow(k, sorted_combined[k])

Я знаю, что некоторые люди говорили, что пытаются использовать writer.writerow ([k] + sorted_combined) или writer.writerow (ключ, * значение)

, и ни один из них не работает.Я получаю следующие сообщения об ошибках: невозможно объединить кортеж.

Я ожидаю получить следующее:

 Subject     Sij      gij
 sub001_01   6578     18
 sub992_03   3820     5

***** РЕДАКТИРОВАТЬ ******* Вот как выглядит мой sorted_combined ... однако (16) например, в конце вы видите, что это уже не кортеж, а строка.При именовании ключа словаря каждый кортеж был преобразован в строку.

[('network6_QNS_0045_01_ (1, 6)', (0.0, 0.0)), ('network6_QNS_0045_01_ (1, 4)', (0.0, 0.0)), ('network6_QNS_0045_01_ (0, 6)', (0.0, 0.0)), ('network6_QNS_0045_01_ (2, 5)', (0.0, 0.0)), ('network6_QNS_0045_01_ (1, 7)', (0.0, 0.0)), ('network6_QNS_0045_01_ (1, 5)', (0.0, 0.0)), ('network6_QNS_0045_01_ (1, 3)', (0.0, 0.0)), ('network6_QNS_0045_01_ (5, 6)',(0.0, 0.0)), ('network6_QNS_0045_01_ (3, 5)', (0.0, 0.0)), ('network6_QNS_0045_01_ (2, 6)', (743466.0, 18.387329999999999)), ('network6_QNS_0045_01_ (5, 7)', (142774.0, 18.769649999999999)), ('network6_QNS_0045_01_ (0, 5)', (232822.0, 20.160640000000001)), ('network6_QNS_0045_01_ (3, 6)', (780163.0, 24.7481399_0_996) 99))', (199652.0, 26.635860000000001)), (' network6_QNS_0045_01_ (4, 7) ', (2248433.0, 27.278729999999999)), (' network6_QNS_0045_01_ (3, 4) ', (922289.0, 27.9796_000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 или M либо 00 либо) ', (396823.0, 29.924759999999999)), ('network6_QNS_0045_01_ (4, 6)', (2897317.0, 30.266200000000001)), ('network6_QNS_0045_01_ (0, 4)', (520923.0, 31.040569999999999)) ((network6_QNS_0000), 32.68)), ('network6_QNS_0045_01_ (2, 4)', (3622715.0, 35.321170000000002)), ('network6_QNS_0045_01_ (2, 7)', (364815.0, 37.499250000000004)) ((network6_QN_00)145240.0, 38.878059999999998)), ('network6_QNS_0045_01_ (0, 7)', (224456.0, 46.5182)), ('network6_QNS_0045_01_ (0, 3)', (1692.0, 56.884950000000003)) ('6_6) (6), 6_6)(280955.0, 57.616190000000003)), ('network6_QNS_0045_01_ (3, 7)', (2012.0, 71.302719999999994)), ('network6_QNS_0045_01_ (0, 2)', (1660.0, 84.085009999999997))] * 1013

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Вы можете создать список, сгладить его и просто написать его, используя CSV .Я не знаю, есть ли более короткий путь.

import csv

my_dict = {"sub001_01": [6578,18], "sub992_03": [3820,5]}

with open('my_file.csv', 'w') as f:
    w=csv.writer(f)
    w.writerow(["Subject", "Sij", "gij"])
    for i in list(my_dict.items()):
        #We first make a list like: ['test', 1, 2, 3]
        list1=[a for a in i]
        list_final=[]
        list_final.append(i[0])
        for c in list1[1]:
            list_final.append(c)
        #We use writerow() to write our new list
        w.writerow(list_final)

Вывод:

Subject,Sij,gij
sub001_01,6578,18
sub992_03,3820,5

Чтобы использовать '\ t' вместо запятых, просто укажите разделитель

w=csv.writer(f,delimiter="\t")

, который будет выдавать:

Subject Sij gij
sub001_01   6578    18
sub992_03   3820    5

PS: это для Python 3.X

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

0 голосов
/ 08 февраля 2019

Я отредактировал свой ответ, вы не используете словарь.У вас есть список кортежей.

import csv 
with open('output.csv', 'wb') as f:
    writer = csv.writer(f)
    writer.writerow(['Subject', 'Sij', 'gij'])
    for row in sorted_combined:
        l = [row[0]]
        l.append(row[0][1])
        l.append(row[1][1])
        writer.writerow(l)

Точно так же, как вы делали это в своей первоначальной попытке, csv.writer - это то, что нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...