如何将一个字典列表转化为元组列表?

6

我有一个如下的字典列表:

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'}]

我该如何把上面的列表转换为(*)格式?
l_2 = [('cat','39.99','True'),('cat','67.99','True'),('dog','67.00','False'),....,('fish','11.28','True')]

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

for l in new_list:
        new_lis.append(l.items())

然而,我无法将字典列表中的第二个元素位置提取为元组列表,如(*)所示。

1
在你的循环中尝试使用 l.values() - PRMoureu
2个回答

7

选项1
使用 map(简洁明了,但速度较慢):

l_2 = list(map(lambda x: tuple(x.values()), l))

lambda函数中,指定您希望将dict值创建为元组。这也可以使用普通函数加速,而不是lambda
def foo(x): 
     return tuple(x.values())

l_2 = list(map(foo, l))

print(l_2)
[
    ('39.99', 'cat', 'True'),
    ('67.99', 'cat', 'True'),
    ('67.00', 'dog', 'False'),
    ('11.28', 'fish', 'True')
]

选项 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')
]

请注意,在所有这些解决方案中,生成的元组没有保证的顺序。
计时
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

1
@J.Do 很高兴能帮忙。 :) - cs95
不考虑字典顺序? - user2357112
@user2357112 恭喜达成10万!是的,字典本来就是无序的。唯一保持顺序的方法是使用OrderedDicts。 - cs95
可能值得提到排序方面的问题。当人们想要元组时,通常希望有一个一致的顺序。 - user2357112
我有一个问题。如果我们想要从特定的值中创建元组,而不是从所有值中创建,该怎么做?例如仅具有 [('cat', 'True'), ('cat', 'True'), ('dog', 'False'), ('fish', 'True')]。 - beginner
1
作为初学者,维护一个白名单值集合,然后迭代您的记录(参见选项2),添加一个条件:仅在记录值在白名单中时附加。 - cs95

5
你需要的是 .values() 而不是 .items(),例如(使用 列表推导式):
l_2 = [tuple(x.values()) for x in l]

输出:

[('cat', 'True', '39.99'), ('cat', 'True', '67.99'), ('dog', 'False', '67.00'), ('fish', 'True', '11.28')]

我有一个问题。如果我们想要从某些值中创建元组,而不是从所有值中创建元组,该怎么做呢?例如,只有 [('cat', 'True'), ('cat', 'True'), ('dog', 'False'), ('fish', 'True')]。 - beginner
1
选择你想要的键,例如: [(x['pet'], x['available']) for x in l] - Mohd
非常感谢!我之前尝试使用tuple()函数做同样的事情,结果是错误的。 - beginner

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