你会怎么转这个字符串:
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)
但我仍然坚持如何将列表项转换为字典,然后我可以用它来填充另一个列表。
答案 0 :(得分:4)
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
str
是内置类型,因此将字符串分配给str
覆盖
内置的。最好选择一些其他变量名来避免
未来令人惊讶的错误。我向后读写列表推导:
[ expression # (3)
for variable in # (2)
iterable # (1)
]
(1):首先,了解可迭代。在上面的解决方案中,这是text.split('|')
。
(2):for variable in
会导致variable
分配给iterable
中的值,一次一个。
(3):最后,expression
可以是任何Python表达式,(通常)使用variable
。
生成器表达式的语法几乎相同。列表推导和生成器表达式之间的区别在于列表推导返回列表,而生成器表达式返回迭代器 - 一个按需生成其内容的对象(因为它是循环的,或者{{1} } {而不是像next
一样生成所有项目。
如果列表很长,列表会占用大量内存。 生成器表达式将消耗更少的内存(甚至可以是无限的),因为并非所有元素都必须同时存在于内存中。
答案 1 :(得分:0)
使用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
。
答案 2 :(得分:0)
这里的关键见解是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
答案 3 :(得分:0)
也许这样:
>>> 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'