#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
- Понимание списков — очень удобный способ построения
подобных списков. - Dict может быть создан из итерируемых пар ключ-значение. Итерируемый, используемый выше, был выражением генератора.
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'