python преобразовать сложный список списков в строку - PullRequest
0 голосов
/ 07 мая 2020

У меня есть сложный список списков, который выглядит так:

[[['MARIA DUPONT',
   ' infos : ',
   [' age = 28',
    ' yeux = bleus',
    ' sexe = femme']],
  [' + ']],
 [['PATRICK MARTIN',
   ' infos : ',
   [' age = 53',
    ' yeux = marrons',
    ' sexe = homme']],
  [' + ']],
 [['JULIE SMITH',
   ' infos : ',
   [' age = 17',
    'yeux = verts',
    'sexe = femme']],
  [' fin ']]]

Я пытаюсь преобразовать его в строку. В конце я хочу напечатать это:

MARIA DUPONT,
 infos :
 age = 28 
 yeux = bleus 
 sexe = femme 

 + 

PATRICK MARTIN
 infos :
 age = 53
 yeux = marrons
 sexe = homme

 + 

JULIE SMITH
 infos :
 age = 17
 yeux = verts
 sexe = femme

 fin

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

Я пытаюсь использовать ''.join(list) и ''.join(x for x in list)

Но в обоих случаях у меня есть ошибка TypeError: list indices must be integers or slices, not list

I Я пробовал другие способы, но теперь я запутался и не нашел хорошего решения для достижения своей цели.

Любая помощь будет принята с благодарностью, и заранее спасибо. (и извините за мой плохой английский sh!)

Ответы [ 4 ]

1 голос
/ 07 мая 2020

Вы можете использовать str.join с одним проходом по спискам:

data = [[['MARIA DUPONT', ' infos : ', [' age = 28', ' yeux = bleus', ' sexe = femme']], [' + ']], [['PATRICK MARTIN', ' infos : ', [' age = 53', ' yeux = marrons', ' sexe = homme']], [' + ']], [['JULIE SMITH', ' infos : ', [' age = 17', 'yeux = verts', 'sexe = femme']], [' fin ']]]
r = '\n'.join('\n'.join([a, b, *c, f'\n{k}\n']) for [a, b, c], [k] in data)

Вывод:

MARIA DUPONT
 infos : 
 age = 28
 yeux = bleus
 sexe = femme

 + 

PATRICK MARTIN
 infos : 
 age = 53
 yeux = marrons
 sexe = homme

 + 

JULIE SMITH
 infos : 
 age = 17
 yeux = verts
 sexe = femme

 fin 

Если ваши списки произвольно вложены, вы можете использовать рекурсию с генератор:

def flatten(d):
  if isinstance(d, str):
     yield d
  else:
     yield from [i for b in d for i in flatten(b)]

print('\n'.join(flatten(data)))
1 голос
/ 07 мая 2020

.join () не будет работать со списком в списке. Я могу предложить вам решение, основанное на рекурсии.

def list_to_str(_list):
    result = ""
    if isinstance(_list, list):   
        for l in _list:
            result += list_to_str(l)
    else:
        result += _list
    return result

result_string = list_to_str(your_list)

print(result_string)
1 голос
/ 07 мая 2020

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

def convert_list(dataset):
    result = ''
    for element in dataset:
        if isinstance(element, list):
            result += convert_list(element)
        else:
            result += str(element)
    return result

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

1 голос
/ 07 мая 2020

Напишите рекурсивную функцию для доступа к вашим спискам, как показано ниже:

def print_data(input_list):

    for obj in input_list:
        if isinstance(obj, list):
            print_data(obj)
        else:
            print(obj)



input_list = [[['MARIA DUPONT',
                    ' infos : ',
                    [' age = 28',
                     ' yeux = bleus',
                     ' sexe = femme']],
                   [' + ']],
                  [['PATRICK MARTIN',
                    ' infos : ',
                    [' age = 53',
                     ' yeux = marrons',
                     ' sexe = homme']],
                   [' + ']],
                  [['JULIE SMITH',
                    ' infos : ',
                    [' age = 17',
                     'yeux = verts',
                     'sexe = femme']],
                   [' fin ']]]
print_data(input_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...