【问题标题】:Appending the counts of lists to a dictionary将列表计数附加到字典
【发布时间】:2021-09-17 19:41:33
【问题描述】:

我有一个大列表,我将其分成小列表,其中包含随机出现的 1 和 0 的元素。

另外,前两个列表的参数与后两个不同。

Example:
list_of_lists[0] =[1,0,1,1,1,0,1,1,1,0]
list_of_lists[1] =[0,0,0,0,0,0,0,0,0,0]
list_of_lists[2] =[1,1,1,1,1,1,1,1,1,1]
list_of_lists[3] =[0,0,1,1,1,1,1,1,1,0]

我想计算每个列表中 1 和 0 的出现次数,并将它们附加到字典中以绘制出现次数。

我的试用如下:

counts_each = dict()
for i in range(4): #all 4 lists
  for k in list_of_lists[i]: #elements of the lists
    counts_each[k] = counts_each.get(k, 0) + 1
print(counts_each)

计算所有列表中 1 和 0 的一般出现次数:

{0: 16, 1: 24}

如果我这样做:

list_counts = []
for i in range(4): 
  counts_each = dict()
  for k in list_of_lists[i]: 
    counts_each[k] = counts_each.get(k, 0) + 1
    list_counts.append(counts_each)
print(list_counts)

它不会累积所有计数:

[{0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {0: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {1: 10},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7},
 {0: 3, 1: 7}]

我很高兴能了解我做错了什么。 谢谢。

【问题讨论】:

  • 您可以编辑问题以包含预期的输出吗?

标签: python list loops dictionary for-loop


【解决方案1】:

您可以让集合模块为您完成所有计数工作。

from collections import Counter

list_of_lists = [[] for _ in range(4)]
list_of_lists[0] =[1,0,1,1,1,0,1,1,1,0]
list_of_lists[1] =[0,0,0,0,0,0,0,0,0,0]
list_of_lists[2] =[1,1,1,1,1,1,1,1,1,1]
list_of_lists[3] =[0,0,1,1,1,1,1,1,1,0]

counters = [Counter(l) for l in list_of_lists]
print(*counters, sep="\n")

输出

Counter({1: 7, 0: 3})
Counter({0: 10})
Counter({1: 10})
Counter({1: 7, 0: 3})

【讨论】:

    【解决方案2】:

    给定嵌套列表,您可以使用Dict Comprehension

    list_of_lists = [[1,0,1,1,1,0,1,1,1,0], [0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1], [0,0,1,1,1,1,1,1,1,0]]
    

    以这种方式使用它:

    { idx: {0: lst.count(0), 1: lst.count(1)} for idx, lst in enumerate(list_of_lists) }
    #=> {0: {0: 3, 1: 7}, 1: {0: 10, 1: 0}, 2: {0: 0, 1: 10}, 3: {0: 3, 1: 7}}
    

    在上述情况下,我使用索引作为键,但您可以只使用列表推导来获取字典列表:

    [ {0: lst.count(0), 1: lst.count(1)} for lst in list_of_lists ]
    #=> [{0: 3, 1: 7}, {0: 10, 1: 0}, {0: 0, 1: 10}, {0: 3, 1: 7}]
    

    【讨论】:

      【解决方案3】:

      Chris Doyle 的回答非常好,但也许您的目标是具体了解您的解决方案的问题。

      您没有包含您的预期输出。如果我是正确的,您当前解决方案的问题是计数的重复,并且您想要这样的输出:

      [{1: 7, 0: 3}, {0: 10}, {1: 10}, {0: 3, 1: 7}]
      

      那么问题似乎在于list_counts.append(counts_each) 行的缩进。你每次都通过k 循环(遍历列表中的项目)执行此操作,而我认为您只想在完成给定列表的计数后才这样做:

      list_counts = []
      for i in range(4):
        counts_each = dict()
        for k in list_of_lists[i]:
          counts_each[k] = counts_each.get(k, 0) + 1
        list_counts.append(counts_each)
      
      print(list_counts)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 2020-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多