如何以最简单的方式获取以下词典?

时间:2019-05-08 05:26:26

标签: python python-3.x list dictionary

我在这里得到一个列表:

my_list=["Alex:1990:London", 
         "Tony:1993:NYC", 
         "Kate:2001:Beijing", 
         "Tony:2001:LA", 
         "Alex:1978:Shanghai"]

如何以最简单的方式从 my_list 获取目标词典 my_target_dict

my_target_dict={
                "Alex":["Alex:1990:London", "Alex:1978:Shanghai"], 
                "Tony":["Tony:1993:NYC", "Tony:2001:LA"], 
                "Kate":"Kate:2001:Beijing"
               }

4 个答案:

答案 0 :(得分:4)

使用defaultdict

>>> from collections import defaultdict
>>> my_list=["Alex:1990:London", "Tony:1993:NYC", "Kate:2001:Beijing", "Tony:2001:LA", "Alex:1978:Shanghai"]
>>> d =  defaultdict(list)
>>> for item in my_list:
...     name, *_ = item.partition(":")
...     d[name].append(item)
... 
>>> d
defaultdict(<class 'list'>, {'Alex': ['Alex:1990:London', 'Alex:1978:Shanghai'], 'Tony': ['Tony:1993:NYC', 'Tony:2001:LA'], 'Kate': ['Kate:2001:Beijing']})
>>> d["Alex"]
['Alex:1990:London', 'Alex:1978:Shanghai']

您可以使用此理解来清除列表中包裹的单个项目:

>>> {k:v if len(v) > 1 else v[0] for k,v in d.items()}
{'Alex': ['Alex:1990:London', 'Alex:1978:Shanghai'], 'Tony': ['Tony:1993:NYC', 'Tony:2001:LA'], 'Kate': 'Kate:2001:Beijing'}

答案 1 :(得分:1)

如果您打算仅严格使用列表和词典,请尝试以下操作:

my_target_dict=dict()
for value in my_list:
    key=value.split(':')[0]
    if key in my_target_dict:
        my_target_dict[key].append(value)
    else:
        my_target_dict[key]=[value]
 print(my_target_dict)

答案 2 :(得分:0)

如果您是初学者(如我所见),并且不想使用Python的 collections 模块并从头开始实现(这是理解集合)。

  

一旦熟悉了这一点,就可以使用 collections 模块,它很漂亮,因为它具有许多类,例如defaultdictOrderedDict等,可以增强工作的速度。

这是我尝试过的(不要忘记阅读注释行)。

  

我编写了一个名为 get_my_target_dict()的函数,该函数使用 my_list 并返回 my_target_dict 。这是模块化实现(您应该首选)。

     

re 是使用正则表达式的模块。此处用于匹配“ Alex:1990:London” (即,在周围的空格)类型的字符串(如果有的话)(错误)。

import re

def get_my_target_dict(my_list):
    my_target_dict = {} # dictionary

    for string in my_list:
        # "Alex:1990:London" => ["Alex", "1990", "London"]
        # "Alex :   1990: London" => ["Alex", "1990", "London"]
        items = re.split(r"\s*:\s*", string) # `\s*` is to match spaces around `:`
        print(items)

        # Alex, Tony etc.
        key = items[0]

        if key in my_target_dict:
            my_target_dict[key].append(string)
        else:
            my_target_dict[key] = [string]

    return my_target_dict


if __name__ == "__main__":
    my_list=["Alex:1990:London", 
             "Tony:1993:NYC", 
             "Kate:2001:Beijing", 
             "Tony:2001:LA", 
             "Alex:1978:Shanghai"]

    # Call get_my_target_dict(), pass my_list & get my_target_dict
    my_target_dict = get_my_target_dict(my_list)
    print(my_target_dict)
    # {'Alex': ['Alex:1990:London', 'Alex:1978:Shanghai'], 'Tony': ['Tony:1993:NYC', 'Tony:2001:LA'], 'Kate': ['Kate:2001:Beijing']}

    # Pretty printing dictionary
    import json
    print(json.dumps(my_target_dict, indent=4))
    # {
    #     "Alex": [
    #         "Alex:1990:London",
    #         "Alex:1978:Shanghai"
    #     ],
    #     "Tony": [
    #         "Tony:1993:NYC",
    #         "Tony:2001:LA"
    #     ],
    #     "Kate": [
    #         "Kate:2001:Beijing"
    #     ]
    # }

答案 3 :(得分:0)

这是我为您提供的解决方案:

my_list=["Alex:1990:London", "Tony:1993:NYC", "Kate:2001:Beijing", "Tony:2001:LA", "Alex:1978:Shanghai"]
dict = {}
for idx, content in enumerate(my_list):
    name = content[:(content.index(':'))]
    if name not in dict:
        dict[name] = []
    dict[name].append(my_list[idx])
  1. 首先,如果您不了解enumerate,它将计算您的索引, 取列表中每个元素的内容。
  2. 第二,用字符串的基本python命名那里的人。我使用name = content[:(content.index(':'))]来将字符串从开始到第一个符号“:”。
  3. 第三,检查dict的密钥是否存在。否则,它将删除该键列表中的所有元素。
  4. 最后但并非最不重要的一点是,将所需元素添加到关键命令中。

您的最终结果:

{'Alex': ['Alex:1990:London', 'Alex:1978:Shanghai'], 'Tony': ['Tony:1993:NYC', 'Tony:2001:LA'], 'Kate': ['Kate:2001:Beijing']}