У меня есть этот список:
list1 = ["['word']", "['second', 'first']", "['first']"]
Вы можете видеть, что это не совсем список строк, поскольку элементы были преобразованы в строки.
Я хочу получить этот плоский вывод:
list2 = ['word', 'second', 'first', 'first']
Простой список строк.
Я пытался использовать этот способ:
list2 = [ x.strip('[]') for x in list1]
Но проблема со вторым пунктом все еще рассматриваетсякак один элемент:
["'word'", "'second', 'first'", "'first'"]
Итак, я попытался разбить запятую:
list3 = [item.split(',') for x in list2 for item in x]
Но он дал такой вывод:
[["'"],
['w'],
['o'],
['r'],
['d'],
["'"],
["'"],
['s'],
['e'],
['c'],
['o'],
['n'],
['d'],
["'"],
['', ''],
[' '],
["'"],
['f'],
['i'],
['r'],
['s'],
['t'],
["'"],
["'"],
['f'],
['i'],
['r'],
['s'],
['t'],
["'"]]
Любая идея, как это исправить?
ОБНОВЛЕНИЯ - РЕШЕНИЕ
С помощью @AKX
list2 = [ast.literal_eval(item) for item in list1]
Затем с помощью этой функции:
def flatten(lst):
for el in lst:
if isinstance(el, list):
yield from el
else:
yield el
list3 = flatten(list2)
list(list3)
Это дает:
['word', 'second', 'first', 'first']
ОБНОВЛЕНИЕ 2
Оптимизированное и альтернативное решение от @waynelpu вместо функции flatten , просто используйте:
list2 = [inner for item in list1 for inner in ast.literal_eval(item)]