有没有更好的方法来获取字典列表中的字典值?

时间:2021-03-02 02:09:55

标签: python python-3.x

我有一个这样的列表:

[{'enter_time': '2021-03-01 07:15:16', 'leave_time': '2021-03-01 07:16:06'}, {'enter_time': '2021-03-02 08:15:16', 'leave_time': '2021-03-02 08:16:06'}]

如你所见,列表中的每一项都是一个字典。 现在,我想得到一个包含所有 enter_timeleave_time 的新列表。 我应该得到一个这样的新列表:

>>> new_list
>>> ['2021-03-01 07:15:16', '2021-03-01 07:16:06', '2021-03-02 08:15:16', '2021-03-02 08:16:06']

我以一种尴尬的方式尝试过:

datetime_str_list = [{'enter_time': '2021-03-01 07:15:16', 'leave_time': '2021-03-01 07:16:06'}, {'enter_time': '2021-03-02 08:15:16', 'leave_time': '2021-03-02 08:16:06'}]
new_list = []
for item in datetime_str_list:
    for dict_value in item.values():
        new_list.append(dict_value)
print('new_list', new_list)

我不知道如何以优雅的方式实现这一点。期待您的解决方案。

3 个答案:

答案 0 :(得分:5)

这应该有效:

times = [{'enter_time': '2021-03-01 07:15:16', 'leave_time': '2021-03-01 07:16:06'}, 
        {'enter_time': '2021-03-02 08:15:16', 'leave_time': '2021-03-02 08:16:06'}]

显式方法

我首先创建一个列表来保存结果 (new_times)。 对于原始列表中名为 times 的每个项目,我们提取与两个键中的每一个关联的值:enter_timeleave_time

我们可以使用语法 item['enter_time'] OR item['leave_time'] 引用其中的每一个。

Python 列表对象的 .extend() 方法允许我们通过向列表末尾添加多个项目来扩展列表(与一次只添加一个项目的 `.append() 方法相比) ).

new_times = list()
for item in times:
    new_times.extend([item['enter_time'], item['leave_time']])

这样,new_times 应该会产生:

['2021-03-01 07:15:16',
 '2021-03-01 07:16:06',
 '2021-03-02 08:15:16',
 '2021-03-02 08:16:06']

更简洁的方法(也可能是更 Pythonic 的方法)

如果显式引用 item 的各个元素没有任何好处,我们可以通过调用与每个 .values 字典关联的 item 来简单地引用它们。

new_times = list()
for item in times:
     new_times.extend(item.values())

嵌套列表理解方法:

可以通过嵌套推导来实现这一点,但这可能会以牺牲可读性为代价。

new_times_lc = [value for subdict in times for value in subdict.values()]

基本上,这相当于嵌套的 for 循环。

答案 1 :(得分:2)

对于列表理解方法:

ggsave("agg_png-ggsave.png", p, device = ragg::agg_png, res = 300,  units = "in") 
ggs <- image_read("agg_png-ggsave.png")
print(ggs)

这会将原始字典中的所有值分配到一个列表列表中,然后将该列表展平为所有值的一维列表

答案 2 :(得分:1)

使用地图功能:

from itertools import chain

times = [{'enter_time': '2021-03-01 07:15:16', 'leave_time': '2021-03-01 07:16:06'}, {'enter_time': '2021-03-02 08:15:16', 'leave_time': '2021-03-02 08:16:06'}]

new_times = list(chain(*list(map(lambda x: list(x.values()), times))))

这会从每个字典中获取值并解压它们,类似于列表推导式。

相关问题