【问题标题】:How to transform a list of dicts into a list of tuples?如何将字典列表转换为元组列表?
【发布时间】:2017-07-10 23:16:58
【问题描述】:

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

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())

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

【问题讨论】:

  • 在你的循环中尝试l.values()

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


【解决方案1】:

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

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

lambda 函数中,指定您希望从dict 值中创建一个元组。这也可以使用 vanilla 函数来加速,而不是 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

【讨论】:

  • @J.Do 很高兴为您提供帮助。 :)
  • 不考虑字典排序?
  • @user2357112 恭喜获得 100k!是的,听写一开始是无序的。保持顺序的唯一方法是它们是 OrderedDicts。
  • 至少值得一提的是订购问题。当人们想要元组时,他们通常想要一个一致的顺序。
  • @beginner 维护一组列入白名单的值,然后遍历您的记录(请参阅选项 2)并添加一个条件,仅当记录值在您的白名单中时才追加。
【解决方案2】:

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

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 '), ('鱼', '真')]
  • 选择你想要的键,例如:[(x['pet'], x['available']) for x in l]
  • 非常感谢!我用 tuple() 函数尝试了同样的事情,这是一个错误。
猜你喜欢
  • 2010-10-15
  • 2019-04-17
  • 2013-04-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多