如何将一个dicts列表转换为元组列表?

J.D*_*.Do 4 python list-comprehension list python-3.x

我有一个这样的词典列表:

l = [{'pet': 'cat', 'price': '39.99', 'available': 'True'}, 
{'pet': 'cat', 'price': '67.99', 'available': 'True'}, 
{'pet': 'dog', 'price': '67.00', 'available': 'False'}
,....,
{'pet': 'fish', 'price': '11.28', 'available': 'True'}]
Run Code Online (Sandbox Code Playgroud)

我怎样才能将上面的列表转换成?(*):

l_2 = [('cat','39.99','True'),('cat','67.99','True'),('dog','67.00','False'),....,('fish','11.28','True')]
Run Code Online (Sandbox Code Playgroud)

我尝试使用.items()l[1]:

for l in new_list:
        new_lis.append(l.items())
Run Code Online (Sandbox Code Playgroud)

但是,我无法将字典列表的第二个元素位置提取到元组列表中,如 (*)

cs9*_*s95 5

选项1
使用map(短而甜,但很慢):

l_2 = list(map(lambda x: tuple(x.values()), l))
Run Code Online (Sandbox Code Playgroud)

lambda函数中,指定您希望从dict值中创建元组.这也可以使用vanilla函数加速,而不是lambda:

def foo(x): 
     return tuple(x.values())

l_2 = list(map(foo, l))
Run Code Online (Sandbox Code Playgroud)

print(l_2)
[
    ('39.99', 'cat', 'True'),
    ('67.99', 'cat', 'True'),
    ('67.00', 'dog', 'False'),
    ('11.28', 'fish', 'True')
]
Run Code Online (Sandbox Code Playgroud)

选项2
使用列表理解.另一个答案已经为此提供了解决方案.

或者,作为现有解决方案的修复,您只需要替换.items().values():

new_list = []
for x in l:
     new_list.append(tuple(x.values()))

print(new_list)
[
    ('39.99', 'cat', 'True'),
    ('67.99', 'cat', 'True'),
    ('67.00', 'dog', 'False'),
    ('11.28', 'fish', 'True')
]
Run Code Online (Sandbox Code Playgroud)

请注意,在所有这些解决方案中,没有保证生成的元组的顺序.


计时

Solution 1 (improved):   100000 loops, best of 3: 2.47 µs per loop 
Solution 2:             1000000 loops, best of 3: 1.79 µs per loop
Your solution:           100000 loops, best of 3: 2.03 µs per loop
Run Code Online (Sandbox Code Playgroud)


Moh*_*ohd 5

您需要的是.values()而不是.items()例如(使用list-comprehension):

l_2 = [tuple(x.values()) for x in l]
Run Code Online (Sandbox Code Playgroud)

输出:

[('cat', 'True', '39.99'), ('cat', 'True', '67.99'), ('dog', 'False', '67.00'), ('fish', 'True', '11.28')]
Run Code Online (Sandbox Code Playgroud)