根据最大值的长度从Python字典列表中查找项目?

3
假设我有一个字典如下:
dicl = {'amazon': [668, 667, 879], 'flipkart': [678], 'hey': [89,79]}

我希望按照字典项目长度的降序打印字典项。
我想要的输出:
{'amazon' : 3, 'hey' : 2, 'flipkart' : 1}

但是我得到的结果是按项目排序的,而我想根据项目的降序显示项目?

我尝试过的:

cov_m = {k : len(v) for k, v in sorted(dicl.items())}

当前输出:

{'amazon' : 3, 'flipkart' : 1, 'hey' : 2}

1
这不是一个有效的字典。 - Eular
5个回答

5
你可以将一个键 lambda 函数作为参数传递给 sorted 函数,以指定排序标准:
dicl = {'amazon': [668, 667, 879], 'flipkart' : [678], 'hey' : [89,79]}

cov_m = {k : len(v) for k, v in sorted(dicl.items(), key = lambda i : -len(i[1]))}

print(cov_m)

输出:

{'amazon': 3, 'hey': 2, 'flipkart': 1}

这里,len(i[1]) 是值的长度,我通过使用 -len(i[1]) (负数长度)进行排序,因为你想要它们按降序排列。如果有更高级的排序标准,请使用 , reverse=True

谢谢Geek先生。假设我需要保留以下商品详细信息:{'amazon': ([668, 667, 879], 3), 'hey': ([89, 79], 2), 'flipkart': ([678], 1)}。我该如何做?我尝试了以下代码,但没有得到期望的结果:{k[0]: (len(v)) for k, v in sorted(dicl.items(), key=lambda x: len(x[1]), reverse=True)} - M S
1
@MishraS 只需在 cov_m 的定义中将 k : len(v) 更改为 k : (v, len(v)) - DjaouadNM

2
使用自定义键值对sorted进行排序。 例子:
dicl = {'amazon': [668, 667, 879], 'flipkart': [678], 'hey' : [89,79]}
print({k: len(v) for k, v in sorted(dicl.items(), key=lambda x: len(x[1]), reverse=True)})

输出:

{'amazon': 3, 'hey': 2, 'flipkart': 1}

2
我会将数据转换成一个已排序的列表:

我会将数据转换成已排序的列表:

data = {'amazon': [668, 667, 879], 'flipkart': [678], 'hey': [89,79]}
sorted_data = sorted([{'name':k, 'val':len(v)} for k,v in data.items()],
                     key=lambda x: x['val'],
                     reverse=True)

print(sorted_data)

输出:

[{'name': 'amazon', 'val': 3}, {'name': 'hey', 'val': 2}, {'name': 'flipkart', 'val': 1}]

2

两个建议的答案都在每个项目上调用了len()两次。为什么不只调用一次呢?(不是为了性能而是为了酷炫)

代码

Original Answer:
dicl = {'amazon': [668, 667, 879], 'flipkart': [678], 'hey' : [89,79]}

length_dict = {k: len(v) for k, v in dicl.items()} 

# Sort on length-values in dict, use inverse of length as @MrGeek suggests
sorted_on_values = sorted(
    length_dict.items(),
    key=lambda d: -d[1]
)
sorted_dict = dict(sorted_on_values)

output

{'amazon': 3, 'hey': 2, 'flipkart': 1}

2
最初的回答:你可以像这样做:

你可以像下面这样做:

 dicl = {'amazon': [668, 667, 879], 'flipkart': [678], 'hey' : [89,79]}

 cov_m = {k : len(v) for k,v in sorted(dicl.items(), key=lambda x:x[1])}

输出

{'amazon': 3, 'hey': 2, 'flipkart': 1}

1
只有在希望保留添加新键值对的顺序时才需要OrderedDict。在OP的情况下,他已经有了一个填充好的字典,希望对其进行排序。 - samredai
@SamLegesse,你说得对,这就是为什么我提供了两种解决方案。如果他想保留字典,则可以使用OrderedDict。 - Somil
2
如果您使用的是Python 2,请返回已翻译的文本。 - Laurens Koppenol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接