2016-07-27 7 views
0

У меня есть список строкСоздание словаря из списка строк

list = ['2(a)', '2(b)', '3', '3(a)', '1d', '5'] 

где намеренное что 1д, 3 и 5 не включают круглые скобки.

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

dict = {'2': 'a', '2': 'b', '3': 'a', '1': 'd'} 

или

dict = {'2': ['a', 'b'], '3': ['a'], '1': ['d']}. 

По сути, игнорируют эти строки без буквы а-г. Я использовал регулярные выражения для извлечения из верхнего списка:

['a', 'b', 'a', 'd'], 

но это не помогло мне значительно облегчить мой словарь.

Любая помощь очень ценится.

+4

Где из '' d''должен был прийти? Кроме того, dict не может отображать '' 2'' как для '' a'', так и '' b'', поэтому вам придется пойти со второй структурой для вашего dict. – user2357112

+1

Можете ли вы показать, что вы пробовали до сих пор? –

ответ

2

Это хорошее время, чтобы использовать setdefault() для словаря, чтобы определить структуру вашего словаря. Первая часть включает в себя захват чисел из элементов с помощью регулярного выражения, которое фиксирует все числа. Затем list объединяется с использованием join().

Затем мы извлекаем только алфавит символов, используя либо списка понимания ->[j for j in i if j.isalpha()], или передать в качестве генератораj for j in i if j.isalpha() (генератора в нашем случае, соединение элементов какstringвместе еще раз).

Наконец проверка, чтобы увидеть, что оба key и value существуют, так что мы можем установить наш словарь, чтобы иметь этот формат ->{ '' : [] , ...}

import re 

def to_dict(l): 
    d = {} 
    for i in l: 
     key = re.findall(r'\d+', i) 
     value = ''.join(j for j in i if j.isalpha()) 
     if key and value: 
      d.setdefault(''.join(key), []).append(value)  
    return d 

Пример вывода:

l = ['2(a)', '2(b)', '3', '3(a)', '1c', '5'] 
print to_dict(l) 
>>> {'1': ['c'], '3': ['a'], '2': ['a', 'b']} 
+0

Там нет понимания списка, только выражение генератора. – TigerhawkT3

+0

@ TigerhawkT3 обновлен с дополнительной информацией, отличный ответ кстати! – ospahiu

4

Поскольку словарь не может содержать дубликаты ключей, используйте defaultdict:

import collections 
l = ['2(a)', '2(b)', '3', '3(a)', '1c', '5'] 
d = collections.defaultdict(list) 
for item in l: 
    num = ''.join(c for c in item if c.isdigit()) 
    word = ''.join(c for c in item if c.isalpha()) 
    if word and num: 
     d[num].append(word) 

Результат:

>>> print(d) 
defaultdict(<class 'list'>, {'2': ['a', 'b'], '1': ['c'], '3': ['a']}) 
Смежные вопросы