【问题标题】:How to Create a Dictionary Using Keys and Values from a Previous Dictionary?如何使用以前字典中的键和值创建字典?
【发布时间】:2019-05-02 18:59:15
【问题描述】:

我需要创建一个字典,其键是以前创建的字典中的值。我以前的字典是:

{100000: (400, 'Does not want to build a %SnowMan %StopAsking', ['SnowMan', 'StopAsking'], [100, 200, 300], [400, 500]), 
100001: (200, 'Make the ocean great again.', [''], [], [400]), 
100002: (500, "Help I'm being held captive by a beast!  %OhNoes", ['OhNoes'], [400], [100, 200, 300]), 
100003: (500, "Actually nm. This isn't so bad lolz :P %StockholmeSyndrome", ['StockholmeSyndrome'], [400, 100], []), 
100004: (300, 'If some random dude offers to %ShowYouTheWorld do yourself a favour and %JustSayNo.', ['ShowYouTheWorld', 'JustSayNo'], [500, 200], [400]), 
100005: (400, 'LOLZ BELLE.  %StockholmeSyndrome  %SnowMan', ['StockholmeSyndrome', 'SnowMan'], [], [200, 300, 100, 500])}

这个字典的形式是 {key: (id, string, tags, likes, dislikes)} 我需要创建一个字典,其键是第一个字典中的标签,其值是包含标签的 id 和字符串,以字典的形式呈现。

例如,如果我们取标签'SnowMan',新字典应该是这样的:

{'SnowMan': {400: ['Does not want to build a %SnowMan %StopAsking', 'LOLZ BELLE.  %StockholmeSyndrome  %SnowMan']}}

或者,如果我们使用标签'StockholmeSyndrome',新字典应该是这样的:

{'StockholmeSyndrome': {
        500: ["Actually nm. This isn't so bad lolz :P %StockholmeSyndrome"], 
        400: ['LOLZ BELLE.  %StockholmeSyndrome  %SnowMan']}}

最后,新字典需要包含之前字典中的所有标签作为键,包括没有标签的事件。

我真的被困在这个问题上,谁能提供一些指导?

【问题讨论】:

    标签: python python-3.x dictionary nested


    【解决方案1】:

    使用collections.defualtdict,您可以迭代并附加到嵌套字典结构中的列表:

    from collections import defaultdict
    
    dd = defaultdict(lambda: defaultdict(list))
    for id_, text, tags, likes, dislikes in d.values():
        for tag in tags:
            dd[tag][id_].append(text)
    
    print(dd)
    
    defaultdict(<function __main__.<lambda>>,
                {'': defaultdict(list, {200: ['Make the ocean great again.']}),
                 'JustSayNo': defaultdict(list,
                             {300: ['If some random dude offers to %ShowYouTheWorld do yourself a favour and %JustSayNo.']}),
                 'OhNoes': defaultdict(list,
                             {500: ["Help I'm being held captive by a beast!  %OhNoes"]}),
                 'ShowYouTheWorld': defaultdict(list,
                             {300: ['If some random dude offers to %ShowYouTheWorld do yourself a favour and %JustSayNo.']}),
                 'SnowMan': defaultdict(list,
                             {400: ['Does not want to build a %SnowMan %StopAsking',
                               'LOLZ BELLE.  %StockholmeSyndrome  %SnowMan']}),
                 'StockholmeSyndrome': defaultdict(list,
                             {400: ['LOLZ BELLE.  %StockholmeSyndrome  %SnowMan'],
                              500: ["Actually nm. This isn't so bad lolz :P %StockholmeSyndrome"]}),
                 'StopAsking': defaultdict(list,
                             {400: ['Does not want to build a %SnowMan %StopAsking']})})
    

    defaultdictdict 的子类,因此您通常不需要进一步操作。但是,如果您需要一个常规的 dict 对象,您可以使用递归函数:

    def default_to_regular_dict(d):
        """Convert nested defaultdict to regular dict of dicts."""
        if isinstance(d, defaultdict):
            d = {k: default_to_regular_dict(v) for k, v in d.items()}
        return d
    
    res = default_to_regular_dict(dd)
    
    print(res)
    
    {'': {200: ['Make the ocean great again.']},
     'JustSayNo': {300: ['If some random dude offers to %ShowYouTheWorld do yourself a favour and %JustSayNo.']},
     'OhNoes': {500: ["Help I'm being held captive by a beast!  %OhNoes"]},
     'ShowYouTheWorld': {300: ['If some random dude offers to %ShowYouTheWorld do yourself a favour and %JustSayNo.']},
     'SnowMan': {400: ['Does not want to build a %SnowMan %StopAsking',
       'LOLZ BELLE.  %StockholmeSyndrome  %SnowMan']},
     'StockholmeSyndrome': {400: ['LOLZ BELLE.  %StockholmeSyndrome  %SnowMan'],
      500: ["Actually nm. This isn't so bad lolz :P %StockholmeSyndrome"]},
     'StopAsking': {400: ['Does not want to build a %SnowMan %StopAsking']}}
    

    【讨论】:

    • @jpp 无论如何,这个函数在开始时不打印 defaultdict(, ?另外,对于键 'SnowMan',我认为应该有两个字符串内键 400 的文本。即 {'SnowMan': {400: ['Does not want to build a %SnowMan %StopAsking', 'LOLZ BELLE. %StockholmeSyndrome %SnowMan']},而此输出仅打印其中一个字符串。
    • defaultdictdict 的子类,它确实不应该打扰您,但如果确实如此,请使用更新后的帖子中的函数。
    • @JakeThompson,另外,请参阅重复 400 内键的更新,您可以使用 dd = defaultdict(lambda: defaultdict(list)) 定义嵌套的 defaultdict 结构。
    【解决方案2】:

    这个呢?

    keys = ['name', 'last_name', 'phone_number', 'email']
    dict2 = {x:dict1[x] for x in keys}
    

    【讨论】:

      【解决方案3】:

      在查看了您的要求后,我已使用以下代码更新了我之前的帖子。我相信这就是您想要实现的目标。唯一需要的导入是来自集合模块的OrderedDict

      from collections import OrderedDict
      from pprint import PrettyPrinter as pp
      
      
      str_tag_dict = {}
      for v in d.values():
          str_tag_dict[v[1]] = v[2]
      
      def same_tags_and_ids(str1, str2):
          dd = {str1:str_tag_dict[str1], 
                str2:str_tag_dict[str2]}
          tag = []
          v = dd[str1]
          for vv in v:
              for ks in dd.keys():
                  if vv in dd[ks]:
                      tag.append(vv)
                      for tg in tag:
                          if tag.count(tg) > 1:
                              return tg
          return None
      
      ordp = OrderedDict(sorted(d.items()))
      def same_tags_diff_ids():
          x = []
          y = []
          my_str = []
          for v in ordp.values():
              x.append(v[2][0])
              x.append(v[0])
              x.append(v[1])
              for i in x:
                  if x.count(i) > 1 and type(i) == str:
                      y.append(i)
          for i in range(len(x)):
              if x[i] == list(set(y))[0]:
                  my_str.append({list(set(y))[0]:{x[i + 1]:[x[i + 2]]}})
          d={}
          k1, v1 = list(my_str[0][list(my_str[0])[0]].items())[0]
          k2, v2 = list(my_str[1][list(my_str[1])[0]].items())[0]
          d.update({list(my_str[0].keys())[0]:{k1:v1, k2:v2}}) 
          if not d == None:
              return d
          else:
              return None
      dup_tag_str = same_tags_diff_ids()
      
      for k, v in ordp.items():
          del d[k]
          for tag in v[2]:
              d[tag] = {v[0]:[v[1]]}
      
      ordp = OrderedDict(sorted(d.items()))
      ids= [list(v.keys())[0] for v in ordp.values()]
      strs= [list(v.values())[0][0] for v in ordp.values()]
      
      x = 0
      for n in range(len(ordp)):
          tmp_keys = []
          for k, v in ordp.items():
              if not strs[x] == list(v.values())[0][0]:
                  if ids[x] == list(v.keys())[0]:
                      key = same_tags_and_ids(strs[x], list(v.values())[0][0])
                      if not key == None:
                          tmp_keys.append(key)
                          if tmp_keys.count(key) == 1:
                              continue
                          else:
                              ordp[key][list(v.keys())[0]].append(strs[x])
          x += 1
      dx = dup_tag_str
      dy = dict(ordp)
      dy.update(dx)
      pp().pprint(dy)               
      

      输出:

       {'': {200: ['Make the ocean great again.']},
       'JustSayNo': {300: ['If some random dude offers to %ShowYouTheWorld do '
                       'yourself a favour and %JustSayNo.']},
       'OhNoes': {500: ["Help I'm being held captive by a beast!  %OhNoes"]},
       'ShowYouTheWorld': {300: ['If some random dude offers to %ShowYouTheWorld 
        do yourself a favour and %JustSayNo.']},
       'SnowMan': {400: ['LOLZ BELLE.  %StockholmeSyndrome  %SnowMan',
                     'Does not want to build a %SnowMan %StopAsking']},
       'StockholmeSyndrome': {400: ['LOLZ BELLE.  %StockholmeSyndrome %SnowMan'],
                              500: ["Actually nm. This isn't so bad lolz :P "
                                '%StockholmeSyndrome']},
       'StopAsking': {400: ['Does not want to build a %SnowMan %StopAsking']}}
      

      【讨论】:

        猜你喜欢
        • 2017-12-20
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 2018-06-21
        • 2021-01-15
        • 2016-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多