将字典列表转换为列表

13

我有一个表单中的字段列表。

fields = [{'name':'count', 'label':'Count'},{'name':'type', 'label':'Type'}]

我想提取仅包含名称的内容并将其放入列表中。目前,我的做法是:

names = [] 
for field in fields:
    names.append(field['name'])

有没有另外一种方法来完成相同的事情,而不涉及遍历列表。

我正在使用Python 2.7。

感谢您的帮助!

4个回答

17
您可以使用列表推导式:
>>> fields = [{'name':'count', 'label':'Count'},{'name':'type', 'label':'Type'}]
>>> [f['name'] for f in fields]
['count', 'type']

它创建所需的列表。我建议使用相同的解决方案。 - Reut Sharabani
@BleedingFingers 的意思是,如果名称已经存在,则不能在不添加另一行的情况下将其用于附加。看看他的解决方案。 - Reut Sharabani
1
@ReutSharabani:你看到OP代码中的names = []这一行了吗?那是我们所给的内容的一部分。 - DSM
1
@BleedingFingers 然后使用 names += [f['name'] for f in fields] - Hyperboreus
@everybody names = [f['name'] for f in fields] 这一行代码与 OP 的三行代码具有相同的功能。 - Hyperboreus
显示剩余5条评论

5
请查看列表推导式 也可以尝试:
names = [x['name'] for x in fields]

例子:

>>> fields = [{'name':'count', 'label':'Count'},{'name':'type', 'label':'Type'}]
>>> [x['name'] for x in fields]
['count', 'type']

如果names已经存在,您可以使用map函数(以相同的方式创建)将新列表中的每个成员附加到它上面:

map(names.append, [x['name'] for x in fields])

例子:

>>> a = [1, 2 ,3]
>>> map(a.append, [2 ,3, 4])
[None, None, None]
>>> a
[1, 2, 3, 2, 3, 4]

编辑:

不确定为什么我没有提到list.extend,这里有一个例子:

names.extend([x['name'] for x in fields])

或者直接使用加号运算符:
names += [x['name'] for x in fields]

您也可以使用像预期的那样使用if语句即可实现“即时”筛选:

names = [x['name'] for x in fields if x and x['name'][0] == 'a']

例子:

>>> l1 = ({'a':None}, None, {'a': 'aasd'})
>>> [x['a'] for x in l1 if (x and x['a'] and x['a'][0] == 'a')]
['aasd']

这将生成一个名字以'a'开头的所有x的列表。


1

names = [x ['name'] for x in fields] 可以实现。

如果列表 names 已经存在,则:

names += [x['name'] for x in fields]

1
map(names.append, [x['name'] for x in fields])非常不符合惯用法。在OP使用的Python 2中,它会创建然后丢弃一个空列表,在Python 3中则根本不执行任何操作。 - DSM

0

如果表单已经定义良好,也就是说,每个字典中都必须定义'name',那么您可以使用以下代码:

map(lambda x: x['name'], fields)

如果不是的话,你可以在提取之前使用“filter”来确保你不会得到“KeyError”。
map(lambda x: x['name'], filter(lambda x: x.has_key('name'), fields))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接