首页 > 解决方案 > python:从字典中提取多个键

问题描述

拜托,我想要一种更简单的方法来从这本字典的键中提取每个第一个元素:

s = [((3, 6), 9.0), ((1, 6), 8.0), ((3, 8), 8.0), ((3, 7), 7.0), ((0, 6), 7.0), ((1, 8), 7.0), ((0, 8), 6.0), ((2, 4), 6.0), ((1, 7), 6.0), ((2, 6), 5.0), ((2, 9), 5.0), ((0, 7), 5.0), ((3, 5), 5.0), ((2, 8), 4.0), ((1, 5), 4.0), ((0, 4), 4.0), ((3, 2), 4.0), ((2, 3), 4.0), ((2, 1), 3.0), ((1, 2), 3.0), ((2, 7), 3.0), ((1, 4), 3.0), ((0, 5), 3.0), ((0, 9), 3.0), ((3, 0), 2.0), ((0, 3), 2.0), ((2, 0), 2.0), ((3, 4), 2.0), ((0, 2), 2.0), ((1, 9), 2.0), ((1, 3), 1.0), ((2, 5), 1.0), ((3, 9), 1.0), ((1, 0), 1.0), ((0, 1), 1.0), ((3, 1), 1.0), ((3, 3), 0.0), ((1, 1), 0.0), ((0, 0), 0.0), ((2, 2), 0.0)]

我想得到这样的东西:

[3, 1, 3, 3, 0, 1, 0, 2, 1, 2, 2, 0, 3, 2, 1, 0, 3, 2, 2, 1, 2, 1, 0, 0, 3, 0, 2, 3, 0, 1, 1, 2, 3, 1, 0, 3, 3, 1, 0, 2]

这就是我所做的:

l = [a[0][0] for a in s]

我想要一种有效的方式来做到这一点

标签: python

解决方案


s是嵌套元组的列表。dict但是您可以通过将它传递给dict构造函数来轻松地从中创建一个。但是如果你真的有一个dict,你可以使用 . 从每个键元组中有效地提取第一项operator.itemgetter

from operator import itemgetter

s = [
    ((3, 6), 9.0), ((1, 6), 8.0), ((3, 8), 8.0), ((3, 7), 7.0), ((0, 6), 7.0), ((1, 8), 7.0), 
    ((0, 8), 6.0), ((2, 4), 6.0), ((1, 7), 6.0), ((2, 6), 5.0), ((2, 9), 5.0), ((0, 7), 5.0), 
    ((3, 5), 5.0), ((2, 8), 4.0), ((1, 5), 4.0), ((0, 4), 4.0), ((3, 2), 4.0), ((2, 3), 4.0), 
    ((2, 1), 3.0), ((1, 2), 3.0), ((2, 7), 3.0), ((1, 4), 3.0), ((0, 5), 3.0), ((0, 9), 3.0), 
    ((3, 0), 2.0), ((0, 3), 2.0), ((2, 0), 2.0), ((3, 4), 2.0), ((0, 2), 2.0), ((1, 9), 2.0), 
    ((1, 3), 1.0), ((2, 5), 1.0), ((3, 9), 1.0), ((1, 0), 1.0), ((0, 1), 1.0), ((3, 1), 1.0), 
    ((3, 3), 0.0), ((1, 1), 0.0), ((0, 0), 0.0), ((2, 2), 0.0)
]

d = dict(s)
print(d)

a = list(map(itemgetter(0), d))
print(a)

输出

{(3, 6): 9.0, (1, 6): 8.0, (3, 8): 8.0, (3, 7): 7.0, (0, 6): 7.0, (1, 8): 7.0, (0, 8): 6.0, (2, 4): 6.0, (1, 7): 6.0, (2, 6): 5.0, (2, 9): 5.0, (0, 7): 5.0, (3, 5): 5.0, (2, 8): 4.0, (1, 5): 4.0, (0, 4): 4.0, (3, 2): 4.0, (2, 3): 4.0, (2, 1): 3.0, (1, 2): 3.0, (2, 7): 3.0, (1, 4): 3.0, (0, 5): 3.0, (0, 9): 3.0, (3, 0): 2.0, (0, 3): 2.0, (2, 0): 2.0, (3, 4): 2.0, (0, 2): 2.0, (1, 9): 2.0, (1, 3): 1.0, (2, 5): 1.0, (3, 9): 1.0, (1, 0): 1.0, (0, 1): 1.0, (3, 1): 1.0, (3, 3): 0.0, (1, 1): 0.0, (0, 0): 0.0, (2, 2): 0.0}
[3, 1, 3, 3, 0, 1, 0, 2, 1, 2, 2, 0, 3, 2, 1, 0, 3, 2, 2, 1, 2, 1, 0, 0, 3, 0, 2, 3, 0, 1, 1, 2, 3, 1, 0, 3, 3, 1, 0, 2]

但是,除非您使用 Python 3.6+,否则您可能不应该这样a做,因为在早期版本中,字典不保留插入顺序,因此不能保证s.

如果您实际上没有dict,但您只有该s列表,那么您的代码

l = [a[0][0] for a in s]

很好。


推荐阅读