[英]Python: Fast way to update value in dict based on length of text?
我有一个这样的集合列表。 我基本上想将其转换为字典并解决重复的键,我想取长度更长的文本值:
[('hong kong', 'state'),
('hong kong', 'city'),
('hong', 'country'),
('kong', 'city'),
('hong kong', 'country')]
所以想要的结果是:
{'state': 'hong kong',
'city': 'hong kong',
'country': 'hong kong'}
我有一个函数可以做到这一点,但我确信有一种更好、更高效和 Pythonic 的方法来做到这一点。 这是我所做的:
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 上面的 sorted 方法更简洁,因为您不必从集合中导入 defaultdict,但这是原始代码的 Pythonic 版本:
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'}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.