【问题标题】:Counter of lists of lists列表列表计数器
【发布时间】:2022-11-14 03:12:54
【问题描述】:

我有一个来自模拟循环的大字典,看起来像这样:

my_dict = {
    'a': {
        1: [[1,2,3], [1,2,3], [1,2,3], [1,3,5]],
        2: [[2,44,57,18], [2,44,57,18], [2,44,57,23], [2,44,57,23]]},
    'b': {
        3: [[3,67,50], [3,67,50], [3,36]],
        4: [[4,12,34], [4,12]]}}

结构本身很奇怪,但我想不出任何其他方式将其存储在我的循环中。我的最终目标是获得每个元素的每个字母键 (a,b) 相同的列表比例。也就是说,我想要这个(任何格式,不需要字典):

重要的是,我不关心列表元素中的比较。我需要比较完整列表是否出现多次。在每个至少中没有重复的元素。 Counter 不在列表级别运行,如果我将列表转换为字符串,我以后无法备份它们(即 "123" --> [1,2,3][1,23])。

我还尝试移动到熊猫数据框并爆炸列,但是 count() 也不起作用...

同样重要的是,我确实关心效率,因为大约有 700k 个列表。

【问题讨论】:

标签: python counter


【解决方案1】:

您可以在调用Counter 之前将列表转换为tuples

from collections import Counter
summary = []
for     name1 in my_dict.keys():
    for ind   in my_dict[name1]:
        C     = Counter(map(tuple, my_dict[name1][ind]))
        total = sum(C.values())
        for arr,freq in C.items():
            summary.append([name1, ind, list(arr), freq , total])

for row in summary:
    print(row)

# ['a', 1, [1, 2, 3]      , 3, 4]
# ['a', 1, [1, 3, 5]      , 1, 4]
# ['a', 2, [2, 44, 57, 18], 2, 4]
# ['a', 2, [2, 44, 57, 23], 2, 4]
# ['b', 3, [3, 67, 50]    , 2, 3]
# ['b', 3, [3, 36]        , 1, 3]
# ['b', 4, [4, 12, 34]    , 1, 2]
# ['b', 4, [4, 12]        , 1, 2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 2017-03-08
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多