首页 > 解决方案 > 有没有更好的方法来获取字典列表中的字典值?

问题描述

我有一个这样的列表:

[{'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_time和组成的新列表leave_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)

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

标签: pythonpython-3.x

解决方案


这应该有效:

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 list 对象的.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循环。


推荐阅读