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
中的值?
答案 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()
函数,将其传递name
和id
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)