2013-06-24 4 views
1

У меня есть список, как это:Как преобразовать этот список в заданный формат?

hello = [[<User: mr--adhikari>], [<User: mr--adhikari>], [<User: mr--adhikari>, <User: awesome>]] 

Я хочу, чтобы преобразовать список выглядеть следующим образом:

[['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari', 'awesome']] 

Пробовал с:

re = [i.split(':')[1] for i in hello] 
ref = [i.split('>')[0] for i in ref] 

Это работает, если у меня есть только не имеют двух элементов в одном списке. Я могу или не могу иметь два элемента в одном списке.

Edit: Мой динамический список:

shared_username = ['[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>, <User: awesome>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]'] 

shared_username = [[y.lstrip('<User: ').rstrip('>') for y in x] for x in shared_username] 

Результат:

[['[', '', '', '', '', '', '', '', 'm', '', '-', '..so on 

ответ

1

Используйте комбинацию sts.lstrip и str.rstrip:

Демо:

>>> strs = '[<User: mr--adhikari>]' 
>>> strs = strs.lstrip('[<User: ') 
>>> strs 
'mr--adhikari>]' 
>>> strs = strs.rstrip('>]') 
>>> strs 
'mr--adhikari' 

Код:

>>> hello = [['<User: mr--adhikari>'], ['<User: mr--adhikari>'], ['<User: mr--adhikari>', '<User: awesome>']] 
>>> [ [y.lstrip('<User: ').rstrip('>') for y in x] for x in hello ] 
[['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari', 'awesome']] 

Update:

>>> shared_username = ['[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>, <User: awesome>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]'] 

>>> [[y.lstrip('[<User: ').rstrip('>]') for y in x.split(', ')] for x in shared_username] 
[['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari', 'awesome'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari']] 

Демо:

strs = '[<User: mr--adhikari>, <User: awesome>]' 

Разделить строку на ', ' первых, чтобы получить список строки, теперь петлю над этим список и подать заявку str.lstrip, str.rstrip, как описано выше.

>>> strs.split(', ') 
['[<User: mr--adhikari>', '<User: awesome>]'] 

Update:

Использование regex:

Демо:

>>> import re 
>>> r = re.compile(r'User:\s([A-Za-z\-._/@]+)') 
>>> strs = '[<User: sachitad>, <User: awesome>]' 
>>> r.findall(strs) 
['sachitad', 'awesome'] 
>>> strs1 = '[<User: mr--adhikari>, <User: awesome>]' 
>>> r.findall(strs1) 
['mr--adhikari', 'awesome'] 
>>> strs2 = '[<User: respect>]' 
>>> r.findall(strs2) 
['respect'] 
>>> strs = '[<User: [email protected]>, <User: awe_so/me>]' 
>>> r.findall(strs) 
['[email protected]', 'awe_so/me'] 

Код:

>>> shared_username = ['[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>, <User: awesome>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]'] 
>>> [r.findall(item) for item in shared_username] 
[['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari', 'awesome'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari'], ['mr--adhikari']] 
+0

См. мой обновленный вопрос. – pynovice

+0

@ user2032220 Я обновил свой ответ. –

+0

'lstrip' - плохая идея. Чтобы процитировать документы: «Аргумент chars не является префиксом, а все комбинации его значений лишены». Он работает с этим набором значений, но если одно из значений было '[]', это даст вам 'pect>]'. – Matthias

0

Просто для подтверждения, являются ли элементы внутри вложенных списков строк или словарей? Если вы не уверены, выполните следующую команду, чтобы проверить первый: тип печати (привет [0] [0])

UPDATE:

Вот альтернатива, которая форматирует вывод в том, как вы просили изначально (без «Пользователь:»).Не самый лаконичный синтаксис, но это, кажется, работает:

def get_user_data(lst, strip_str): 
    new_list = [] 
    for i in range(len(lst)): 
     tmp = lst[i] 
     for j in strip_str: 
      if j in tmp: 
       tmp = tmp.replace(j,'') 
     tmp = tmp.split(',') 
     new_list.append(tmp) 
    return new_list 

shared_username = ['[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>, <User: awesome>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]', '[<User: mr--adhikari>]'] 
new_list = get_user_data(shared_username,['<','>',' ','[',']','User:']) 
print new_list 

Выход: [[ 'г-н - адхикари'], [ 'г-н - адхикари'], [ 'г-н - адхикари'], [ 'mr - adhikari'], ['mr - adhikari', 'awesome'], ['mr - adhikari'], ['mr - adhikari'], ['mr - adhikari'], [' mr - adhikari ']]

+0

Это строка. – pynovice

+0

Спасибо. Я не могу думать о питоническом способе сделать это в одной или двух строках, но должно быть достаточно легко написать функцию для ее обработки. Могут ли имена пользователей содержать любые пробелы, или они всегда будут строками без пробелов, подобных приведенным выше? – ChrisProsser

+0

Ответ, данный @Ashwini Chaudhary, уже сработал. благодаря – pynovice