如何从字典中提取值并从中创建列表

时间:2018-01-30 05:15:13

标签: python python-3.x list dictionary list-comprehension

我有一个词典列表:

dictionaries = [
    {'id': 1, 'name': 'test1', 'description': 'foo'}, 
    {'id': 2, 'name': 'test2', 'description': 'bar'}
]

我想将值与每个字典中的键分开,制作如下列表:

[(1 ,'test1', 'foo'), (2, 'test2', 'bar')]

我有以下代码来执行此操作...

values_list = []

for dict in dictionaries:
    values_list.append(list(dict.values()))

当我在我的应用程序中运行此代码时,我得到:

  

TypeError:list()获取0个位置参数,但是给出了1个

这种类型的列表理解的正确方法是什么?

5 个答案:

答案 0 :(得分:2)

可以通过几个comprehensions来完成:

代码:

def get_values_as_tuple(dict_list, keys):
    return [tuple(d[k] for k in keys) for d in dict_list]

如何?

这是如何工作的?这是一个嵌套的comprehension。让我们从内到外,从以下开始:

tuple(d[k] for k in keys)

这将创建dk中通过keysd指定的所有元素的元组。所以,这很好,但是kkeyskeys到底是什么?

  • k被传递给函数,并且是我们在我们的dicts中寻找的键。

  • keys是来自k in keys的{​​{1}}中的个别值。

  • d是来自dict_list的{​​{1}}中的个人词组。

外部理解构建了上面讨论的元组列表:

d in dict_list

测试代码:

[tuple(d[k] for k in keys) for d in dict_list]

结果:

dictionaries = [{'id': 1, 'name': 'test1', 'description': 'foo'},
                {'id': 2, 'name': 'test2', 'description': 'bar'}]


def get_values_as_tuple(dict_list, keys):
    return [tuple(d[k] for k in keys) for d in dict_list]

print(get_values_as_tuple(dictionaries, ('id', 'name', 'description')))

答案 1 :(得分:0)

嗨如果你想用列表理解技术转换元组列表那么容易,或者你使用它的代码是列表列表但你期望的解决方案看起来像元组列表

dictionaries = [{'id': 1, 'name': 'test1', 'description': 'foo'}, 
{'id': 2, 'name': 'test2', 'description': 'bar'}]
values_list = []

for dict in dictionaries:
    values_list.append(tuple(dict.values()))

data = [tuple(dict.values()) for dict in dictionaries]   

print(values_list)
print(data)

这可能对你有所帮助,你会得到像这样的输出

[(1, 'test1', 'foo'), (2, 'test2', 'bar')]
[(1, 'test1', 'foo'), (2, 'test2', 'bar')]

答案 2 :(得分:0)

In [14]: dictionaries = [{'id': 1, 'name': 'test1', 'description': 
'foo'}, 
   ....: {'id': 2, 'name': 'test2', 'description': 'bar'}]

In [15]: [tuple(d.values()) for d in dictionaries]
Out[15]: [('foo', 1, 'test1'), ('bar', 2, 'test2')]

嗨,Trey,Dict在python中是无序的,所以tuple中的值也可能是无序的。如果你想要一个有序的结果,你可以在python中尝试OrderedDict

答案 3 :(得分:0)

在Python 2.x中:

from collections import namedtuple
dictionaries = [
    {'id': 1, 'name': 'test1', 'description': 'foo'}, 
    {'id': 2, 'name': 'test2', 'description': 'bar'}
]
main_list = []
keys = namedtuple("keys",['id','name','description'])
for val in dictionaries:
    data = keys(**val)
    main_list.append((data.id,data.name,data.description))
print(main_list)
>>>[(1, 'test1', 'foo'), (2, 'test2', 'bar')]

Python 3.x:

dictionaries = [
    {'id': 1, 'name': 'test1', 'description': 'foo'}, 
    {'id': 2, 'name': 'test2', 'description': 'bar'}
]
data = [tuple(val.values()) for val in dictionaries]
print(data)
>>>[(1, 'test1', 'foo'), (2, 'test2', 'bar')]

答案 4 :(得分:0)

代码:

dicts = [
        {'id': 1, 'name': 'test1', 'description': 'foo'}, 
        {'id': 2, 'name': 'test2', 'description': 'bar'}
        ]

v_list = []

for d in dicts:
    v_list.append( tuple( d.values() ) )

print( v_list )

<强>结果:

[(1, 'test1', 'foo'), (2, 'test2', 'bar')]