Свести список строк - PullRequest
       3

Свести список строк

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

У меня есть этот список:

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)] 

Ответы [ 4 ]

0 голосов
/ 25 октября 2018
list1 = ["['word']", "['second', 'first']", "['first']"]
new_lst = [sub_val for val in list1 for sub_val in eval(val)]
print new_lst

Result:['word', 'second', 'first', 'first']
0 голосов
/ 25 октября 2018

Это еще одно решение:

import re
list1 = ["['word']", "['second', 'first']", "['first']"]
pattern = re.compile(r'\w+')
m = pattern.findall(str(list1))

Результат:

['word', 'second', 'first', 'first']
0 голосов
/ 25 октября 2018

Чтобы сгладить все, используйте itertools.chain.from_iterable:

>>> import itertools
>>> import ast
>>> list1 = ["['word']", "['second', 'first']", "['first']"]
>>> list2 = list(itertools.chain.from_iterable(map(ast.literal_eval, list1)))
>>> list2
['word', 'second', 'first', 'first']
0 голосов
/ 25 октября 2018

Если у вас есть список строк выражений Python, представляющих списки (как это для вложенного предложения), вам придется использовать ast.literal_eval(), чтобы вернуться к реальности, как бы.

>>> import ast
>>> list1 = ["['word']", "['second', 'first']", "['first']"]
>>> list2 = [ast.literal_eval(item) for item in list1]
[['word'], ['second', 'first'], ['first']]

Использование ast.literal_eval(), в отличие от опасного eval() , которое не следует использовать , является безопасным, поскольку оно оценивает только литералы, которые не имеют побочных эффектов.

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