Записывать встроенные списки в виде строк в файле - PullRequest
0 голосов
/ 12 октября 2018

У меня есть список с подсписками каждый раз, состоящий из строки, другой строки, а затем список, состоящий из следующих строк:

big_list = [['sentence', 'translation', ['error1', 'error2','error3']], ['sentence','translation',['error1','error2']],['sentence','translation',['error1', 'error2','error3','error4']]]

, и я хочу напечатать каждый встроенный список в отдельной строке сэлементы в списке, разделенные вкладкой, и элементы во встроенном списке с запятой:

sentence   translation   error1, error2, error3
sentence   translation   error1, error2
sentence   translation   error1, error2, error3, error4

, если все элементы в подсписках будут строками, следующий код работает нормально.

with open (outputfile, "w", encoding="utf-8") as f:
    f.writelines('\t'.join(i) + '\n' for i in big_list)

Но с третьим элементом в подсписке, являющимся списком, он становится более сложным, и я не знаю, как лучше всего решить эту проблему?

Все, что я могу придумать, этопреобразование встроенного списка в подсписке сначала в строку также с помощью "".join(j) + "," for j in subsublist,

Итак, я попробовал следующее:

string_errors = ("".join(j) + "," for j in dict["trg_errors"])

Но он говорит, что тип является объектом-генератором, а нестрока.Тогда я все еще не могу использовать свою функцию writelines.Как я могу сделать это строкой?И есть ли более эффективные способы решения этой проблемы?

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Вы можете преобразовать в разумную структуру данных, прежде чем пытаться записать.Нормальная структура для таких наборов данных будет набором строк, поэтому давайте подумаем, как вы это получите:

# pseudo-code:
[(sentence, translation, comma-separated_errors) for ? in big_list]

Это даст нам структуру, которую мы ищем, нокак нам добраться до этого comma-separated_errors из списка ошибок, с которого мы начнем, и что за ? мы повторяем?Давайте рассмотрим их по одному.

Ваш список ошибок - это список строк, и итераторы строк имеют удобный метод str.join, который склеивает их все вместе, поэтому ", ".join(error_list) даст нам это.

big_list - это список списков, где каждый внутренний список равен [sentence, translation, error_list].Это легко сделать с распаковкой списка.

Соберите все вместе, и мы получим:

lines = [(sentence, translation, ', '.join(error_list)) for sentence, translation, error_list in big_list]

Как только мы получим правильную структуру данных, это так же просто, как вызвать '\t'.join(line) for line in lines в writelines.

with open("outputfile.tsv", 'w') as f:
    f.writelines("\t".join(line) for line in lines)
0 голосов
/ 12 октября 2018

я бы так сделал

def get_rows(big_list):
    for small_list in big_list:
        colums = []
        for item in small_list:
            if isinstance(item, str):
                colums.append(item)
            elif isinstance(item, list):
                colums.append(', '.join(item))
        yield '\t'.join(colums)

with open ('tmp_big', "w", encoding="utf-8") as f:
    f.write('\n'.join(get_rows(big_list)))

или

def get_words(big_list):
    for small_list in big_list:
        for item in small_list:
            if isinstance(item, str):
                yield item + '\t'
            elif isinstance(item, list):
                yield ', '.join(item) + '\n'

 with open ('tmp_big', "w", encoding="utf-8") as f:
    f.write(''.join(get_words(big_list)))

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

0 голосов
/ 12 октября 2018

Перед вызовом объединения вкладок вы можете создать новый список строк и затем вызвать его (вы думали в правильном направлении):

for l in big_list:
    print('\t'.join(l[0:-1] + [', '.join(l[-1])]))

Эта часть ', '.join(l[-1]) преобразует подсписок в l в строку, разделенную запятыми.

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