csv Python如何在一个列表中迭代另一个列表

f8rj6qna  于 2023-01-22  发布在  Python
关注(0)|答案(1)|浏览(137)

我有以下的名单如下:

my_list = [
    ['first-column', 'DisplayName', 'FLOW TRIGGERED: 636e56d390c8c0910d592cc6', 'ClassificationType', 'NLU', 'KeyPhrases', 'MetaIntent', 'Description', 'test description', 'SampleSentences', [], 'Regexes'], 
    ['first-column', 'DisplayName', 'FLOW TRIGGERED: 636e56d390c8c0910d592cc6', 'ClassificationType', 'NLU', 'KeyPhrases', 'MetaIntent', 'Description', 'test description', 'SampleSentences', [], 'Regexes'], 
    ['first-column', 'DisplayName', 'FLOW TRIGGERED: 636e56d490c8c01802592cd1', 'ClassificationType', 'NLU', 'KeyPhrases', 'MetaIntent', 'Description', 'test description', 'SampleSentences', ['Pressemitteilung?\n', 'Pressemeldung?\n', 'Wo finde ich den Schlussbericht zur Messe?\n'], 'Regexes'], 
    ['first-column', 'DisplayName', 'FLOW TRIGGERED: 636e56d490c8c0edac592cd8', 'ClassificationType', 'NLU', 'KeyPhrases', 'MetaIntent', 'Description', 'test description', 'SampleSentences', ['Aussteller?\n', 'Ausstellerverzeichnis 2022?\n', 'Welche Aussteller waren 2022 dabei?\n', 'Ausstellerliste 2022?\n', 'Welche Unternehmen waren als Aussteller vertreten?\n'], 'Regexes'], 
    ['first-column', 'DisplayName', 'FLOW TRIGGERED: 636e56d490c8c01739592ce0', 'ClassificationType', 'NLU', 'KeyPhrases', 'MetaIntent', 'Description', 'test description', 'SampleSentences', ['Wie hoch war die Ausstellerzahl 2022?\n', 'Wie viele Unternehmen waren vor Ort\n', 'Anzahl Aussteller?\n', 'Ausstellerzahl?\n', 'Wie viele Aussteller waren auf der Messe vertreten?\n'], 'Regexes']
]

我正在使用上面的列表编写一个CSV文件,如下所示:

rows = zip(*my_list)
    with open('test.csv', "w") as f:
        writer = csv.writer(f, lineterminator='\n\n')
        for row in rows:
            writer.writerow(row)

所以我的CSV看起来像下面。这是我需要的格式。

first-column,first-column,first-column
[],[],"['Pressemitteilung?', 'Pressemeldung?', 'Wo finde ich den Schlussbericht zur Messe?']"
Regexes,Regexes,Regexes

但上面的并不是我所需要的CSV的样子,

我需要它如下:

first-column,first-column,first-column,first-column,first-column

DisplayName,DisplayName,DisplayName,DisplayName,DisplayName

FLOW TRIGGERED: 636e56d390c8c0910d592cc6,FLOW TRIGGERED: 636e56d390c8c0910d592cc6,FLOW TRIGGERED: 636e56d490c8c01802592cd1,FLOW TRIGGERED: 636e56d490c8c0edac592cd8,FLOW TRIGGERED: 636e56d490c8c01739592ce0

ClassificationType,ClassificationType,ClassificationType,ClassificationType,ClassificationType

NLU,NLU,NLU,NLU,NLU

KeyPhrases,KeyPhrases,KeyPhrases,KeyPhrases,KeyPhrases

MetaIntent,MetaIntent,MetaIntent,MetaIntent,MetaIntent

Description,Description,Description,Description,Description

test description,test description,test description,test description,test description

SampleSentences,SampleSentences,SampleSentences,SampleSentences,SampleSentences

[],[],Pressemitteilung?,Aussteller?,Wie hoch war die Ausstellerzahl 2022?

[],[],Pressemeldung?,Ausstellerverzeichnis 2022?,Wie viele Unternehmen waren vor Ort

[],[],Wo finde ich den Schlussbericht zur Messe?,Welche Aussteller waren 2022 dabei?,Anzahl Aussteller?

[],[],[],Ausstellerliste 2022?,Ausstellerzahl?

[],[],[],Welche Unternehmen waren als Aussteller vertreten?,Wie viele Aussteller waren auf der Messe vertreten?

Regexes,Regexes,Regexes,Regexes,Regexes

我怎样才能迭代内部数组,使我的CSV看起来像上面这样?

with open('test.csv', "w") as f:
        writer = csv.writer(f, lineterminator='\n\n')
        for row in rows:
   
            writer.writerow(row)
            writer.writerow(row[1])

但是这会产生奇怪的输出。我是python的新手,有没有人能帮我解决这个问题?
谢谢你,最好的问候

vohkndzv

vohkndzv1#

我不认为这是一个标准的操作,因为看起来你想填充额外的行在您的csv文件的基础上,你目前正在解析。
因此,一个示例解决方案可以检查列中是否有填充列表,然后将其他列表填充到该长度,然后为新列写入csv:

import csv

my_list = [
 ['first-column', [], 'Regexes'], 
 ['first-column', [], 'Regexes'], 
 ['first-column', ['Pressemitteilung?', 'Pressemeldung?', 'Wo finde ich den Schlussbericht zur Messe?'], 'Regexes']
]

def list_length(l):
    return len(l) if isinstance(l, list) else 0
    
def pad_list(l, size):
    if not isinstance(l, list):
        l = [l]
    l.extend([[]] * (size - len(l)))
    return l

rows = zip(*my_list)
with open('test.csv', "w") as f:
    writer = csv.writer(f, lineterminator='\n')

    for row in rows:
        max_len = max([list_length(element) for element in row])
        if max_len > 0:
            row = [pad_list(element, max_len) for element in row]
            subrows = zip(*row)
            for sub in subrows:
                writer.writerow(sub)
        else:
            writer.writerow(row)

其输出:

first-column,first-column,first-column
[],[],Pressemitteilung?
[],[],Pressemeldung?
[],[],Wo finde ich den Schlussbericht zur Messe?
Regexes,Regexes,Regexes

如果你不想让这一行出现在末尾,你也需要显式地处理它,比如:

import csv

my_list = [
 ['first-column', [], 'Regexes'], 
 ['first-column', [], 'Regexes'], 
 ['first-column', ['Pressemitteilung?', 'Pressemeldung?', 'Wo finde ich den Schlussbericht zur Messe?'], 'Regexes']
]

def list_length(l):
    return len(l) if isinstance(l, list) else 0
    
def pad_list(l, size):
    if not isinstance(l, list):
        l = [l]
    l.extend([[]] * (size - len(l)))
    return l

def parse_row(write, row, new_line):
    max_len = max([list_length(element) for element in row])
    if max_len > 0:
        row = [pad_list(element, max_len) for element in row]
        subrows = zip(*row)
        for sub in subrows:
            write(sub, new_line)
    else:
        write(row, new_line)

rows = [list(row) for row in zip(*my_list)]
with open('test.csv', "w", newline='') as f:
    writer = csv.writer(f, lineterminator='')

    def write(row, new_line):
        writer.writerow(row)
        if new_line:
            f.write('\n')

    for row in rows[:-1]:
        parse_row(write, row, True)
    parse_row(write, rows[-1], False)

相关问题