从dict列表中以pythonic方式获得每个键的值的最大长度

2024-05-13 22:02:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种更为python的方法来获取字典列表中每个键的值的最大长度。你知道吗

我的方法是这样的

lst =[{'a':'asdasd', 'b': 123},{'a': 'asdasdasdas'}, {'a':123,'b':'asdasd'}]
dct = {}
for l in lst:
    for key in l:
        dct.update({key: max(dct.get(key,0), len(str(l.get(key,0))))})
print(dct)

输出为

{'b': 6, 'a': 11}

需要str函数来获取整数的长度(也可以是Nones)

这种方法是“pythonic”还是有一种更流畅、更易读的方法使用列表理解或类似的方法。你知道吗


Tags: 方法keyin列表forgetlen字典
3条回答

其他的答案侧重于使用python特性,而不是可读性。我个人认为可读性和简单性是所有“pythonic”特性中最重要的。你知道吗

(我简化了使用字符串来处理所有事情,但是如果您插入str(),它也可以处理整数)

from collections import defaultdict

lst =[{'a':'asdasd', 'b': '123'},{'b': 'asdasdasdas'}, {'a':'123','b':'asdasd'}]

def merge_dict(dic1,dic2) :
    for key,value in dic2.items():
            dic1[key].append(value)

combined = defaultdict(list)
for dic in lst:
    merge_dict(combined, dic)

print( {key : max(map(len,value)) for key, value in combined.items() } )

这里有另一种方法不依赖于排序/压缩,但我不会说一种比另一种更像Python。你知道吗

from itertools import chain

lst =[{'a':'asdasd', 'b': 123}, {'a': 'asdasdasdas'}, {'a':123,'b':'asdasd'}]
dct = {
    k: max(len(str(d.get(k, ""))) for d in lst)
    for k in set(chain.from_iterable(d.keys() for d in lst))
}

print(dct)

或者,您可以使用groupby:

from itertools import chain, groupby

lst =[{'a':'asdasd', 'b': 123}, {'a': 'asdasdasdas'}, {'a':123,'b':'asdasd'}]
dct = {
    k: max(len(str(v)) for _, v in g)
    for k, g in groupby(
        chain.from_iterable(d.items() for d in lst),
        lambda p: p[0]
    )
}

print(dct)

我认为你的方法是相当python的,只是我要把update行改得更清楚一点:

# A little terse
dct.update({key: max(dct.get(key,0), len(str(l.get(key,0))))})
# A little simpler
dct[key] = max(dct.get(key, 0), len(str(l[key])))

下面是一个同时修改变量名的解决方案:

dict_list =[{'a':'asdasd', 'b': 123},{'a': 'asdasdasdas'}, {'a':123,'b':'asdasd'}]
max_lengths = {}
for dictionary in dict_list:
    for k, v in dictionary.items():
        max_lengths[k] = max(max_lengths.get(k, 0), len(str(v)))
print(max_lengths)

相关问题 更多 >