неправильный вывод при объединении двух списков в ipython

У меня есть два списка - list1 при печати выглядит так:

[['KR', 'Alabama', 111], ['KR', 'Alabama', 909], ['KR', 'Alabama', 90], ['KR', 'Alabama', 10], ['KR', 'Arizona', 12], ['KR', 'Arizona', 10], ['KR', 'Arizona', 93], ['KR', 'Arizona', 98],....]

И list2 при печати выглядит так:

[11, 110, 108,....]

Теперь я хочу объединить эти два списка и записать результат в файл csv, чтобы вывод выглядел так:

KR,Alabama,111,11
KR,Alabama,909,110
KR,Alabama,90,108
KR,Alabama,10,34
KR,Arizona,12,45

Таким образом, в основном значения list2 становятся 4-м столбцом в файле csv. Я написал этот код в ipython, но он выдает результат в неправильном формате, а также записывает не все записи в файл (последние 26 записей отсутствуют в файле):

final_list = zip(list1,list2)
print final_list

cdc_part1 = open("file1.csv", 'wb')
wr = csv.writer(cdc_part1, dialect='excel')

wr.writerows(final_list)

Вывод в файле выглядит так:

"['KR', 'Alabama', 111]",11
"['KR', 'Alabama', 909]",110
"['KR', 'Alabama', 90]",108
"['KR', 'Alabama', 10]",34
"['KR', 'Arizona', 12]",45

Как вы можете заметить, " и [] вокруг элемента list1, а строки в list1 имеют ' вокруг них. Как я могу получить правильный формат вывода и почему последние 26 записей не записываются в файл?

ПРИМЕЧАНИЕ: list1, list2, а также final_list, которые я формирую, имеют одинаковый размер (300), но в файле я вижу только 274 записи.


person user2966197    schedule 18.09.2015    source источник


Ответы (3)


Так как list1 — это список списков, выполнение zip(list1, list2) завершится чем-то вроде этого:

[(['KR', 'Alabama', 111], 11),
 (['KR', 'Alabama', 909], 110),
 (['KR', 'Alabama', 90], 108)]

Поэтому вам нужно добавить дополнительный шаг, чтобы добавить последний элемент в первый список.

final_list = [ a + [b] for a, b in zip(list1, list2) ]

Это доставит тебе,

[['KR', 'Alabama', 111, 11],
 ['KR', 'Alabama', 909, 110],
 ['KR', 'Alabama', 90, 108]]

И это должно правильно выводить CSV.

person Aldehir    schedule 18.09.2015
comment
как удалить ' вокруг строк? - person user2966197; 18.09.2015
comment
@user2966197 user2966197 У меня есть строковое представление списка в Python. Используемая вами библиотека CSV должна правильно форматировать CSV-файл. Вам просто нужно изменить строку final_list = ... на строку выше. - person Aldehir; 18.09.2015
comment
также я использую ipython для этого, и поэтому мой код, который записывает в файл csv, есть ли в нем что-то неправильное, что может привести к тому, что последние 26 записей не будут записаны в файл? Есть ли лучший способ записать файл csv в ipython? - person user2966197; 18.09.2015
comment
@user2966197 user2966197 Я не знаю, почему вам не хватает 26 записей. Я бы исследовал эти записи и посмотрел, есть ли какая-то проблема с кодировкой, из-за которой модуль csv их игнорирует. - person Aldehir; 18.09.2015

Вы неправильно используете zip, подробнее см. здесь списки zip в python. проблема в том, что zip объединяет элементы во входных списках, здесь сам элемент в первом списке является списком, поэтому он присоединен к элементам во втором списке. правильный способ сделать это

for each in xrange(0, len(list1)):
    list1[each].append[list2[each]]
print list1
person kaushik94    schedule 18.09.2015

Все дело в том, как работает zip. Из документов:

Возвращает итератор кортежей, где i-й кортеж содержит i-й элемент из каждой из последовательностей аргументов или итерируемых объектов.

Итак, zip ожидает, что каждый аргумент будет итерируемым. Затем он создаст итерируемый (в python2 список) кортежей, захватив i-й элемент каждого аргумента для i-го кортежа. Итак, если вы передадите список списков в качестве первого аргумента и список строк в качестве второго, каждый из ваших конечных элементов будет кортежем, где каждый первый элемент является внутренним списком list1, а второй элемент является соответствующей индексированной строкой из list2.

Вместо этого вы хотите что-то вроде:

final_list = [list1[i] + [list2[i]] for i in \
     range(min(len(list1),len(list2)))]

Что касается того, почему последние 26 записей отсутствуют в файле, из zip-документов:

Итератор останавливается, когда самая короткая итерация ввода исчерпана.

Итак, ваш list2 содержит на 26 элементов меньше, чем list1. Вместо того, чтобы гадать, что добавить к последним 26 элементам из list1, он просто не включает их в результат.

Примечание. Использование min() в новой формулировке final_list, как указано выше, приведет к такому же поведению короткого замыкания.

person lemonhead    schedule 18.09.2015