从词典列表中找到每个键的最大值

时间:2020-07-22 17:11:06

标签: python

data = [{"id": "78ab45",
         "name": "Jonh"},
        {"id": "69cd234457",
         "name": "Joe"}]

我希望函数从所有字典中返回每个键的最大值:

expected_output = [
    { "size": 10, "name": "id" }, #because the length of the largest "id" value is 10
    { "size": 4, "name": "name" }, #because the length of the largest "name" value is 4
]

到目前为止,我的代码:

def my_func(data):
  headers_and_sizes = []
  for item in data:
     for key, value in item.items():
        headers_and_sizes.append({"size": f'{len(value)}', "name": key})
        if int(headers_and_sizes[0]["size"]) < len(value):
            headers_and_sizes[0]["size"] = len(value)
            
  return headers_and_sizes

给我这个:

[{'size': '6', 'name': 'id'}, {'size': '4', 'name': 'name'}, {'size': '10', 'name': 'id'}, {'size': '3', 'name': 'name'}]

如何解决该问题,以便它返回expected_output中的值?

6 个答案:

答案 0 :(得分:1)

您将要更新一个字典,该字典存储每个映射到到目前为止该键所见最大长度的键。

data = [
  {
     "id": "78ab45",
     "name": "Jonh",
  },
  {
     "id": "69cd234457",
     "name": "Joe",
  },
]
key_to_max_len = {}
for datum in data:
   for key, val in datum.items():
        if key not in key_to_max_len or len(val) > key_to_max_len[key]:
            key_to_max_len[key] = len(val)
key_size_arr = [{"size": val, "name": key} for key, val in key_to_max_len.items()]

答案 1 :(得分:1)

您可以像下面的代码那样获得id和name的最大值,并相应地构建输出

>>> data 
[{'id': '78ab45', 'name': 'Jonh'}, {'id': '69cd234457', 'name': 'Joe'}]
id  = max(map(lambda x:len(x['id']), data))
name  = max(map(lambda x:len(x['name']), data))
>>> id
10
>>> name
4

答案 2 :(得分:1)

您可以使用list comprehension组成一个ID和名称为tuple

names_ids = [(eachdict['id'],eachdict['name']) for eachdict in data]

格式化输出以使其具有所需的形状(字典),找到最大长度(使用max()函数,将其传递nameid s的长度,使用另一个列表理解,max()内):

expected_output = \
[{"size":max([len(each[0]) for each in names_ids]),"name":"id"},
 {"size":max([len(each[1]) for each in names_ids]),"name":"name"}] 

输出将是:

[{'name': 'id', 'size': 10}, {'name': 'name', 'size': 4}]

答案 3 :(得分:0)

使用以下内容:

keys = list(data[0].keys())
output = {key:-1 for key in keys}
for d in data:
    for k in d.keys():
        if len(d[k]) > output[k]:
            output[k] = len(d[k])

将输出:

{'id': 10, 'name': 4}

答案 4 :(得分:0)

我认为这里最简单的方法是熊猫...

import pandas as pd
df = pd.DataFrame(data)

out = [{'size': df['id'].str.len().max(), 'name':'id'},
       {'size': df['name'].str.len().max(), 'name':'name'}]

输出:

[{'size': 10, 'name': 'id'}, {'size': 4, 'name': 'name'}]

或其他名称。

[{'size':df[col].str.len().max(), 'name':col} for col in df.columns]

答案 5 :(得分:0)

以下是使用嵌套字典理解的方法:

;with l1 as (
    SELECT COL1, qty
    FROM T
    where col2 is null and col3 is null
)
, l2 as (
    SELECT Col1, COL2, qty
    FROM T
    where col2 is not null and col3 is null
)
, l3 as (
    SELECT Col1, COL2, COL3, qty
    FROM T
    where col2 is not null and col3 is not null
)
, a1 as (
    SELECT COL2, X = STRING_AGG('<' + COL3 + ' qty="' + qty + '"/>' ,'') 
    FROM l3
    GROUP BY Col2
)
, a2 as (
    select X = '<' + a1.Col2 + ' qty="' + l2.qty + '">' + a1.X + '</' + a1.Col2 + '>', l2.Col1
    from a1 
    LEFT JOIN l2 on a1.Col2 = l2.Col2
)
select CONVERT(XML,
    '<' + l1.Col1 + ' qty="' + l1.qty + '">' + STRING_AGG(a2.X,'') + '</' + l1.Col1 + '>' 
)
from a2
left join l1 on l1.Col1 = a2.Col1
group by l1.Col1, l1.qty
GO

输出:

data = [{"id": "78ab45",
         "name": "Jonh"},
        {"id": "69cd234457",
         "name": "Joe"}]


expected_output = [{'size': len(max([i[k] for i in data], key=len)),
                    'name': k} for k in data[0]]

print(expected_output)
相关问题