创建以字符串长度为键,字符串为值的字典

Create dictionary with length of string as key and string as value

我有一个包含随机字符串的列表,如下所示:

strings =  ["zone", "abigail", "theta", "form", "libe", "zas"] 

我想要的是一个字典,其中 len 个字符串(非唯一的,线性的,因为它们在列表中)作为键,字符串作为值。看起来很平庸,但我试图在一行中做到这一点,找到一种更好的方式来编写它。

我试过这个:

dict_of_len = {len(element):element for element in strings} 

但不知何故我将其作为输出:

{4: 'libe', 7: 'abigail', 5: 'theta', 3: 'zas'}

len(dict_of_len) 等于 4。我做错了什么?

我想要的是:

{4: 'zone', 7: 'abigail', 5: 'theta', 4: 'form', 4: 'libe', 3: 'zas'}

dict 键必须是唯一的,一个更好的替代解决方案是将长度存储为键(如您之前所做的那样)并将具有该长度的字符串列表作为值,您可以使用 itertools.groupby(要求数据按分组标准排序):

strings =  ["zone", "abigail", "theta", "form", "libe", "zas"] 

from itertools import groupby

dict_of_len = {k: list(g) for k, g in groupby(sorted(strings, key = len), len)}

print(dict_of_len)

输出:

{3: ['zas'], 4: ['zone', 'form', 'libe'], 5: ['theta'], 7:['abigail']}

作为需要预排序的 groupby 解决方案的替代方案,您可以使用 defaultdict 或使用 setdefault 来简洁地累积值列表:

from collections import defaultdict
dict_of_len = defaultdict(list)
for str in strings:
    dict_of_len[len(str)].append(str)

或者,使用旧的成语:

dict_of_len = {}
for str in strings:
    dict_of_len.setdefault(len(str), []).append(str)

但是groupby解决方案没有错,只要你不介意排序。