【问题标题】:convert list of dicts to list将字典列表转换为列表
【发布时间】:2014-01-20 09:13:47
【问题描述】:

我在这个表单中有一个字段列表

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

我想只提取名称并将其放入列表中。目前,我正在这样做:

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

是否有另一种方法可以做同样的事情,不涉及遍历列表。

我使用的是 python 2.7。

感谢您的帮助。!

【问题讨论】:

    标签: python list python-2.7 dictionary


    【解决方案1】:

    您可以使用列表推导:

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

    【讨论】:

    • 这不会附加到names
    • 它创建所需的列表。我建议相同的解决方案。
    • @BleedingFingers names = [f['name'] for f in fields]
    • @ReutSharabani:你看到 OP 代码中的names = [] 行了吗?这和其他任何东西一样,都是我们得到的一部分。
    • @BleedingFingers 然后使用names += [f['name'] for f in fields]
    【解决方案2】:

    看看list comprehensions

    不妨试试:

    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-s 的列表

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • map(names.append, [x['name'] for x in fields]) 非常单调。在 OP 使用的 Python 2 中,它创建然后丢弃一个空列表,而在 Python 3 中它什么也不做。
      【解决方案4】:

      如果表单定义明确,意思是,'name'必须在每个dict中定义,那么你可以使用:

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

      否则,您可以在提取之前使用filter,以确保您不会得到KeyError

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

      【讨论】:

        猜你喜欢
        • 2017-04-23
        • 2021-10-13
        • 2015-07-23
        • 1970-01-01
        • 2020-05-23
        • 2019-06-11
        • 1970-01-01
        相关资源
        最近更新 更多