簡體   English   中英

Python:根據文本長度更新字典中值的快速方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM