Python:基于文本长度更新dict中值的快速方法



我有一个这样的集合列表。我基本上想把它转换成字典,并解决重复的键,我想取长度更长的文本值:

[('hong kong', 'state'),
('hong kong', 'city'),
('hong', 'country'),
('kong', 'city'),
('hong kong', 'country')]

因此,期望的结果是:

{'state': 'hong kong',
'city': 'hong kong',
'country': 'hong kong'}

我有一个函数可以做到这一点,但我相信有一个更好、更高效的&用蟒蛇的方式做这件事。以下是我所做的:

def create_dict(l):
d=defaultdict(list)
for s in l:
key = s[1]
val = s[0]
if d[key]:
if len(val) > len(d[key]):
d[key] = val
else:
d[key] = val

return d

以下是如何使用带有自定义密钥的sorted方法:

lst = [('hong kong', 'state'),
('hong kong', 'city'),
('hong', 'country'),
('kong', 'city'),
('hong kong', 'country')]
def create_dict(l):
sorted_lst = sorted(l, key=lambda x: len(x[0]))
return {k: v for v, k in sorted_lst}
print(create_dict(lst))

输出:

{'country': 'hong kong', 'city': 'hong kong', 'state': 'hong kong'}

怎么样?

lst = [('hong kong', 'state'),
('hong kong', 'city'),
('hong', 'country'),
('kong', 'city'),
('hong kong', 'country')]
output = {}
for value, key in lst:
if len(output.setdefault(key, value)) < len(value):
output[key] = value

@Ann Zen上面的排序方法更干净,因为您不必从集合中导入defaultdict,但这是原始代码的Python版本:

def create_dict(l)
d = defaultdict(list)
for value, k in l:           
d[k].append(value)
return {k: max(d[k], key=len) for k in d.keys()}

在这里,我们将传递列表中的每个元组解压为value, k,以构建defaultdict(list),而不是通过索引进行显式赋值。然后,不需要使用循环来查找每个列表中最长的字符串,然后在if/else语句中构建dict,只需使用max()函数提取最长字符串,并将其键入直接返回的字典生成器表达式中。返回:

{'state': 'hong kong', 'city': 'hong kong', 'country': 'hong kong'}

最新更新