【问题标题】:How to create a dictionary from a list of lists in python?如何从python中的列表列表创建字典?
【发布时间】:2020-03-07 17:29:51
【问题描述】:

给定一个列表列表,我如何创建一个字典,其中键是列表中的所有项目(一个副本),值是它们成为列表中第一项的次数?

给定:

[['banana', 'oranges', 'grapes'],['banana', 'grapes'],['grapes', 'oranges', 'banana']]

预期:

{'banana': 2, 'grapes': 1, 'oranges': 0}

【问题讨论】:

标签: python python-3.x list dictionary


【解决方案1】:

首先获取第一个元素的列表:

filtered_list = [x[0] for x in initial_list]

以下是您的独特元素:

unique_elements = set([y for x in initial_list for y in x])

现在用来自唯一元素和零值的键初始化字典:

counts = {e: 0 for e in unique_elements}

最后用过滤列表中每个元素的频率更新字典的值。既然你问了一个没有counter 的解决方案,这里有一个简单的循环来实现:

for i in filtered_list:
    counts[i] = counts.get(i, 0) + 1

print(counts)
# {'banana': 2, 'grapes': 1, 'oranges': 0}

【讨论】:

    【解决方案2】:

    创建列表列表:

    ll = [['banana', 'oranges', 'grapes'], ['banana', 'grapes'], ['grapes', 'oranges', 'banana']]
    

    获取唯一键:

    from itertools import chain
    
    d = dict.fromkeys(chain(*ll), 0)
    

    计算列表的第一个元素:

    from collections import Counter
    from operator import itemgetter
    
    c = Counter(map(itemgetter(0), ll))
    

    更新并显示结果:

    d.update(dict(c))
    print(d)
    

    打印:

    {'banana': 2, 'oranges': 0, 'grapes': 1}
    

    【讨论】:

      【解决方案3】:

      您可以使用集合来获取子列表中存在的唯一名称:

      initial_list = [['banana', 'oranges', 'grapes'],['banana', 'grapes'],['grapes', 'oranges', 'banana']]
      
      unique = set()
      
      for l in initial_list:
          unique = unique.union(set(l))
      

      然后计算每个项目存在多少个列表(假设每个项目存在或不存在,不重复):

      from collections import defaultdict
      
      result = defaultdict(lambda: 0)
      for element in unique:
          for l in initial_list:
              result[element] += (element == l[0])
      

      Defaultict 用于获取初始值 0 你的结果应该在result

      boolint 的子类这一事实用于将element == l[0] 评估为10

      如果没有collections,您需要将最后一行编辑为:

      try:
          result[element] += (element == l[0])
      except KeyError:
          result[element] = 1
      

      【讨论】:

        【解决方案4】:

        我之前的所有回复都失败了。这是一个非常快速的实现:

        # l is a list of lists
        import itertools
        ext_l = list(itertools.chain.from_iterable(l))
        l_dic = {element:0 for element in set(ext_l)}
        for i in ext_l: l_dic[i] += 1
        print(l)
        

        【讨论】:

          【解决方案5】:

          简单的实现

          l = [['banana', 'oranges', 'grapes'],['banana', 'grapes'],['grapes', 'oranges', 'banana']]
          unique_items = set([i for sl in l for i in sl])
          d = dict()
          for item in unique_items:
              d[item] = 0
          
          for sublist in l:
              d[sublist[0]] += 1
          
          print(d)
          # output
          # {'grapes': 1, 'oranges': 0, 'banana': 2}
          

          维持秩序

          d = dict()
          for sl in l:
              d[sl[0]] = d.get(sl[0],0) + 1
          print(d)
          # {'banana': 2, 'grapes': 1}
          
          unique_items = set([i for sl in l for i in sl])
          for item in unique_items:
              if item not in d:
                  d[item] = 0
          print(d)
          # {'banana': 2, 'grapes': 1, 'oranges': 0}
          

          【讨论】:

          • 有没有办法在没有集合或计数器的情况下做到这一点。可能只是一个简单的 for 循环?
          • 可以更改订单吗?首先是香蕉,然后是葡萄,然后是橙子。
          • @PotionSeller 插入订单保持不变,here。您需要更改广告顺序。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-18
          • 2013-10-26
          • 2020-11-17
          • 2018-04-27
          • 1970-01-01
          相关资源
          最近更新 更多