Python: создать список, содержащий dicts

#python #list #dictionary

#python #Список #словарь

Вопрос:

как бы вы превратили эту строку:

 str='ldap:alberthwang,eeid:67739|ldap:meng,eeid:107,building:CL5'
  

в список, который даст вам это:

 print x[1]['building']=CL5
  

который будет:

 x=[{'ldap':'alberthwang','eeid':'67739'},{'ldap':'meng','eeid':'107','building':'CL5'}]
  

я попытался сначала разделить строку и добавить в список:

 sample=[]
for s in str.split('|'):
  sample.append(s)
  

Но я застрял на том, как превратить элементы списка в словарь, который я затем могу использовать для заполнения другого списка.

Ответ №1:

 text='ldap:alberthwang,eeid:67739|ldap:meng,eeid:107,building:CL5'
sample=[
    dict(item.split(':') for item in part.split(','))
    for part in text.split('|')]
print(sample)
# [{'eeid': '67739', 'ldap': 'alberthwang'}, {'building': 'CL5', 'eeid': '107', 'ldap': 'meng'}]

print(sample[1]['building'])
# CL5
  
  1. Понимание списков — очень удобный способ построения
    подобных списков.
  2. Dict может быть создан из итерируемых пар ключ-значение. Итерируемый, используемый выше, был выражением генератора.
  3. str это встроенный тип, поэтому назначение строки str перезаписывает встроенный. Лучше выбрать другое имя переменной, чтобы избежать неожиданных ошибок в будущем.

Я читаю и записываю список в обратном порядке:

 [ expression            # (3)
  for variable in       # (2)
  iterable              # (1)
]
  

(1): Сначала разберитесь с итерацией. В приведенном выше решении это text.split('|') .

(2): for variable in вызывает variable присвоение значений по iterable одному за раз.

(3): Наконец, expression может быть любым выражением Python, (обычно) использующим variable .

Синтаксис для выражений генератора почти такой же. Разница между пониманием списка и выражением генератора заключается в том, что понимание списка возвращает список, в то время как выражение генератора возвращает итератор — объект, который выдает свое содержимое по требованию (при циклическом повторении или при next вызове) вместо генерации всех элементов сразу, как в случаес list помощью s.

Список может занимать много памяти, если список длинный. Выражение генератора будет потреблять меньше памяти (и может даже быть бесконечным), потому что не все элементы должны существовать в памяти одновременно.

Комментарии:

1. Я определенно собираюсь потратить много времени на понимание списка

Ответ №2:

Использование str в качестве имени переменной — плохая идея, поскольку оно затмевает встроенное str .

 s ='ldap:alberthwang,eeid:67739|ldap:meng,eeid:107,building:CL5'
res = [dict(colonStr.split(':') for colonStr in ds.split(','))
       for ds in s.split('|')]
  

сохраняет результат, который вы res вводите.

Ответ №3:

Ключевым моментом здесь является то, что dict может принимать список пар ключ / значение. Итак, вы можете сделать это, используя понимание, подобное этому:

 string = 'ldap:alberthwang,eeid:67739|ldap:meng,eeid:107,building:CL5'

list_of_dicts = [dict(item.split(':') for item in items.split(',')) for items in string.split('|')]
print list_of_dicts
  

Ответ №4:

Может быть, так:

 >>> s = 'ldap:alberthwang,eeid:67739|ldap:meng,eeid:107,building:CL5'
>>> x = [dict([d.split(':') for d in ls.split(',')]) for ls in s.split('|')]
>>> x[1]['building']
>>> 'CL5'