Python: создать список, содержащий dicts - PullRequest
2 голосов
/ 08 октября 2011

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

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'}]

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

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

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

Ответы [ 4 ]

4 голосов
/ 08 октября 2011
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 с.

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

0 голосов
/ 08 октября 2011

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

>>> 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'
0 голосов
/ 08 октября 2011

Ключевым моментом здесь является то, что 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
0 голосов
/ 08 октября 2011

Использование 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.

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