Python 如何缩短这个嵌套列表?

Python 如何缩短这个嵌套列表?,python,dictionary,Python,Dictionary,这个问题是这个问题的延续: 我想提出一个新问题。 我在另一个dict中有一些dict。它们有时会变得很大,因为我将它们保存在日志中,所以我想将它们的大小限制为30个“项”(key:value) 所以我尝试了这样的方法:(在示例中,我将大小限制为2) 我得到的输出是: [[1, 2], [4, 5], [0, 2], [1, 3]] 我所期望的是: ['A':['a1':[1, 2],'a2':[4, 5]], 'B':['b1':[0, 2], 'b2':[1, 3]]] 或者类似的。不一定

这个问题是这个问题的延续:

我想提出一个新问题。 我在另一个dict中有一些dict。它们有时会变得很大,因为我将它们保存在日志中,所以我想将它们的大小限制为30个“项”(key:value)

所以我尝试了这样的方法:(在示例中,我将大小限制为2)

我得到的输出是:

[[1, 2], [4, 5], [0, 2], [1, 3]]
我所期望的是:

['A':['a1':[1, 2],'a2':[4, 5]], 'B':['b1':[0, 2], 'b2':[1, 3]]]
或者类似的。不一定是这样,但我需要知道什么值属于什么dict,这在我最终得到的输出中并不清楚

简单地说,我只想把字典里的副词删去。如果可能的话,要优雅。

试试这个:

print({key: {sub_key: lst[:2] for sub_key, lst in sub_dict.items()}
       for key, sub_dict in main_dict.items()})
注意使用
{}
(听写理解)代替
[]
(列表理解)

尝试以下方法:

print({key: {sub_key: lst[:2] for sub_key, lst in sub_dict.items()}
       for key, sub_dict in main_dict.items()})

注意使用了
{}
(dict comprehension)而不是
[]
(列表理解)

我已经根据提供的注释重写了代码。见下文

my_dict = {}

for key, value in main_dict.iteritems():
    sub_dict = {}
    for sub_key, sub_value in value.iteritems():
        sub_dict[sub_key] = sub_value[:2] 
    my_dict[key] = sub_dict

print my_dict
这将为您提供如下内容,并将其保存到单独的变量中

{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}
{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}

我已经根据提供的注释重写了代码。见下文

my_dict = {}

for key, value in main_dict.iteritems():
    sub_dict = {}
    for sub_key, sub_value in value.iteritems():
        sub_dict[sub_key] = sub_value[:2] 
    my_dict[key] = sub_dict

print my_dict
这将为您提供如下内容,并将其保存到单独的变量中

{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}
{'A': {'a1': [1, 2], 'a2': [4, 5]}, 'B': {'b1': [0, 2], 'b2': [1, 3]}}

这是一种很好的简洁方法,可以在一行中完成,而无需更改原始词典:

print({key: {sub_k: ls[:2] for sub_k, ls in sub_dict.items()} for key, sub_dict in main_dict.items()})
输出:

{'A':{'a1':[1,2],'a2':[4,5]},'B':{'b1':[0,2],'b2':[1,3]}


您最初的试用版使用了列表理解
[]
,但本例实际上需要dict理解
{}

这是一种很好的简洁方法,可以在一行中完成,而不必更改原始词典:

print({key: {sub_k: ls[:2] for sub_k, ls in sub_dict.items()} for key, sub_dict in main_dict.items()})
输出:

{'A':{'a1':[1,2],'a2':[4,5]},'B':{'b1':[0,2],'b2':[1,3]}


您最初的试验使用了列表理解
[]
,但这种情况实际上需要dict理解
{}

更有效的方法是使用嵌套的
for
循环删除子列表的末尾:

for d in main_dict.values():
    for k in d:
        del d[k][2:]
main_dict
变为:


更有效的方法是使用嵌套的
for
循环删除子列表的末尾:

for d in main_dict.values():
    for k in d:
        del d[k][2:]
main_dict
变为:

如果字典只嵌套一层

如果字典只嵌套一层



[]
用于列表,使用
{}
用于条目
'b1':[0,2,4]
成为
'b1':[0,2]
,您只需放弃
4
[]
用于列表,使用
{}
用于条目
'b1':[0,2,4]
成为
'b1 0,2]
,您只想丢弃
4
?这不是OP的期望输出,它在他们可能不希望的位置编辑
main\u dict
,因为他们这样做是为了打印到日志文件这不是OP的期望输出,它将他们可能不希望的
main_dict
编辑到位,因为他们这样做是为了打印到日志文件。我相信OP不想缩短字典本身,只想缩短日志。这并不理想,因为OP只想记录缩短的值,他可能想保持原始值不变。OP特别指出“简单地说,我只想把字典里的副词剪短。如果可能的话,要优雅。“他/她没有说他/她需要其他任何原始值。对我来说,使用短语cut short意味着在适当的位置删除项目。@b在链接的问题中,他们说,这样做的唯一目的是缩短他们收到的dict的日志输出-对我来说,这意味着他们想在记录dict后对其做其他事情。如果修改
main_dict
没有问题,这是一种方法。@B.Shefter这不会产生深度副本,只是对同一dict的一个新引用,它仍然会被修改。我相信OP不想缩短字典本身,只想缩短日志。这不理想,因为OP只想记录缩短的值,他可能想保持原始值不变。OP特别说:“简单地说,我只想把字典里的子目录剪短。如果可能的话,要优雅。”他/她没有说他/她需要原始值做任何其他事情。对我来说,使用短语cut short意味着在适当的位置删除项目。@b在链接的问题中,他们说,这样做的唯一目的是缩短他们收到的dict的日志输出-对我来说,这意味着他们想在记录dict后对其做其他事情。如果修改
main_dict
是可以的,这是一种方法。@B.Shefter不会进行深度复制,只是对同一dict的一个新引用,它仍然会被修改,因为不知道dict理解存在。这很好,谢谢。@ZeCarioca很高兴我能帮忙!:)我不知道听写理解的存在。这很好,谢谢。@ZeCarioca很高兴我能帮忙!:)