Записать список списков Python по строкам в файл CSV

#python #csv

#python #csv

Вопрос:

У меня есть такой список

 [[1.75], [4.75]]
[[2.5], [2.5]]
[[3.5], [3.5]]
[[4.0], [4.0]]
  

Я хочу записать это в файл CSV, например

 1.75, 4.75
2.5, 2.5
3.5, 3.5
4.0, 4.0
  

Когда я попытался использовать writerows метод csv модуля, он сохраняется как

 1.75
4.75
2.5
2.5
3.5
3.5
4.0
4.0
  

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

1. Почему каждое значение само по себе является списком? Разверните их, чтобы получить [1.75, 4.75] …?!

2. Предполагая, что вы используете writerow свойство csv.writer объекта, и что вы делаете for row in your_array: , вы можете использовать [l[0] for l in row] в качестве аргумента writerow . (На самом деле я вижу, что вы говорите, что делаете, writerows но, по крайней мере, вы можете выполнять writerow в цикле, даже если вы в данный момент этого не делаете; конечно, можно было бы поместить это в выражение генератора и использовать writerows вместо for цикла, но, вероятно, в этом нет большого преимущества.)

Ответ №1:

Вам нужно распаковать каждую строку в плоский список.

 import csv

my_list = [
    [[1.75], [4.75]],
    [[2.5], [2.5]],
    [[3.5], [3.5]],
    [[4.0], [4.0]],
    ]

with open("my.csv", "w") as f:
    writer = csv.writer(f)

    for row in my_list:
        writer.writerow([l[0] for l in row])
  

Или, если предпочтительнее, for цикл можно заменить выражением генератора, чтобы вы могли использовать его writerows так, как вы делаете в данный момент:

     writer.writerows([l[0] for l in row] for row in my_list)
  

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

1. Что делать, если в списке есть более одного элемента.

2. @user567879 Тогда вместо [l[0] for l in row] вы могли бы использовать [i for l in row for i in l] — это приведет к выравниванию списка списков, даже если в каждом из них более одного элемента.

Ответ №2:

Вот возможное решение:

 import csv

lst = [[[1.75], [4.75]],
       [[2.5], [2.5]],
       [[3.5], [3.5]],
       [[4.0], [4.0]]]

with open('file.csv', 'w') as f:
    writer = csv.writer(f)
    w.writerows([[x[0] for x in lst] for line in lst])
  

Кроме того, вы можете выровнять свой список с помощью itertools.chain :

 from itertools import chain
...
w.writerows([list(chain(*line)) for line in lst])