这是此问题的扩展:How to split a string within a list to create key-value pairs in Python
与上述问题的区别在于我列表中的项目并非都是键值对;某些项目需要分配一个值。
我有一个清单:
list = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty']
我想创建一个词典:
dict = { 'abc':'ddd', 'ef':1, 'ghj':1, 'jkl':'yui', 'rty':1 }
我正在思考以下几点:
a = {}
for item in list:
if '=' in item:
d = item.split('=')
a.append(d) #I don't I can do this.
else:
a[item] = 1 #feel like I'm missing something here.
答案 0 :(得分:12)
对于每个拆分“对”,您可以追加[1]
并提取前两个元素。这样,当没有值时将使用1:
print dict((s.split('=')+[1])[:2] for s in l)
答案 1 :(得分:3)
我会使用与您链接的帖子类似的内容。
d = dict(s.split('=') for s in a)
如果你将从这篇文章中学到的东西 - 也就是使用列表来创建词典 - 和使用if/else in Python's list comprehension结合起来,你可以想出这样的东西:
d = dict(s.split("=", maxsplit=1) if "=" in s else [s, 1] for s in l)
如果没有等号,则将1
添加到拆分列表的末尾。
答案 2 :(得分:1)
input_list = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty']
output_dict = {}
for item in input_list:
item_split = item.split('=')
key = item_split[0]
value = item_split[1] if len(item_split)>1 else 1
output_dict[key] = value
更简洁一点
for item in input_list:
i_s = item.split('=')
output_dict[i_s[0]] = i_s[1] if len(i_s)>1 else 1
这样做的好处是,它不会为通过拆分input_list的元素而创建的每个列表附加额外的元素。但是,列表推导可能比for
循环
答案 3 :(得分:1)
以下是逐步的方法。
In [50]: mylist = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty']
In [51]: [element.split('=') for element in mylist]
Out[51]: [['abc', 'ddd'], ['ef'], ['ghj'], ['jkl', 'yui'], ['rty']]
In [52]: [element.split('=') + [1] for element in mylist]
Out[52]: [['abc', 'ddd', 1], ['ef', 1], ['ghj', 1], ['jkl', 'yui', 1], ['rty', 1]]
In [53]: [(element.split('=') + [1])[:2] for element in mylist]
Out[53]: [['abc', 'ddd'], ['ef', 1], ['ghj', 1], ['jkl', 'yui'], ['rty', 1]]
In [54]: dict((element.split('=') + [1])[:2] for element in mylist)
Out[54]: {'abc': 'ddd', 'ef': 1, 'ghj': 1, 'jkl': 'yui', 'rty': 1}
'ef'
没有等号,我们必须修复dict
类可以采用生成器表达式,因此我们可以安全地删除方括号。有了这个,这里是片段:
mylist = ['abc=ddd', 'ef', 'ghj', 'jkl=yui', 'rty']
mydict = dict((element.split('=') + [1])[:2] for element in mylist)