【问题标题】:How to get the following dictionary in tne easiest way?如何以最简单的方式获取以下字典?
【发布时间】:2019-05-08 05:26:26
【问题描述】:

我在这里得到一个列表:

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"]
               }

【问题讨论】:

  • 如果只有一个项目,您希望它只是项目?考虑到这会让一切变得更加不一致。

标签: python python-3.x list dictionary


【解决方案1】:

使用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'}

【讨论】:

【解决方案2】:

如果您打算只使用列表和字典,请尝试以下操作:

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)

【讨论】:

  • my_target_dict 是我想要的……在它创建之前你不能使用它
  • 字典my_target_dict在创建后被使用。第一行代码创建一个空字典,然后使用 my_list 上的“for”循环将项目添加到其中
【解决方案3】:

这是我给你的解决方案:

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的key是否存在。否则,它将删除该键列表中的所有元素。
  4. 最后但同样重要的是,将您想要的元素附加到您的键字典中。

你的最终结果:

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

【讨论】:

    【解决方案4】:

    如果您是初学者(如我所见)并且不想使用 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"
        #     ]
        # }
    

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多