如何在Python字典列表中计算具有相同键的元素数量

3
我有以下Python字典列表。
list_of_dict = [
    {'id': 0, 'au_type': 1, 'sequence_id': 0, 'AU_start_position': 0},
    {'id': 1, 'au_type': 1, 'sequence_id': 0, 'AU_start_position': 4095}, 
    {'id': 2, 'au_type': 1, 'sequence_id': 0, 'AU_start_position': 8092},
    {'id': 0, 'au_type': 3, 'sequence_id': 0, 'AU_start_position': 5678},    
    {'id': 0, 'au_type': 1, 'sequence_id': 1, 'AU_start_position': 13525}, 
    {'id': 1, 'au_type': 1, 'sequence_id': 1, 'AU_start_position': 13587}, 
    {'id': 2, 'au_type': 1, 'sequence_id': 1, 'AU_start_position': 14576},
    {'id': 0, 'au_type': 3, 'sequence_id': 1, 'AU_start_position': 15019}, 
    {'id': 1, 'au_type': 3, 'sequence_id': 1, 'AU_start_position': 15560}, 
    {'id': 2, 'au_type': 3, 'sequence_id': 1, 'AU_start_position': 16004}
]

我有一个变量seq_count,表示不同的'sequence_id'数量,另一个变量num_classes表示不同的'au_type'数量。 在上面的例子中:

seq_count = 2
num_classes = 2

我需要实现一个列表numid_seq_cl[seq_count][num_classes],返回具有相同'au_type''sequence_id'的不同'id'数。 在上面的例子中,
numid_seq_cl[0][1] = 3
numid_seq_cl[0][3] = 1
numid_seq_cl[1][1] = 3
numid_seq_cl[1][3] = 3

3
好的,你尝试过什么?你的代码在哪里或者如何出现问题了呢?需要实现一个列表... - Mike Scotty
1
我认为你真正想要的是一个字典而不是一个列表。对我来说,列表没有意义。 - Jab
你说得对,事实上我没有发布我获取列表的方法,我应该写下我需要从哪里开始,并不只是要求解决方案。 - user123892
2个回答

1

以下是使用列表的解决方案:

max_au = -1
max_sq = -1
# Find list limits
for item in list_of_dict:
    sq = item['sequence_id']
    max_au = max(max_au, item['au_type'])
    max_sq = max(max_sq, item['sequence_id'])

assert max_au > 0, max_sq >= 0

numid_seq_cl = [[0 for j in range(max_au + 1)] for i in range(max_sq + 1)]

# Fill list
for item in list_of_dict:
    numid_seq_cl[item['sequence_id']][item['au_type']] += 1

print(numid_seq_cl)

输出:

[[0, 3, 0, 1], [0, 3, 0, 3]]

然而,我强烈建议不要使用列表,而是使用字典:

numid_seq_cl = {}

for item in list_of_dict:
    au = item['au_type']
    sq = item['sequence_id']

    # Set default values, so dictionary items can be easily incremented
    if au not in numid_seq_cl:   # Set a default value for the first level of the dictionary
        numid_seq_cl[au] = {}
    if sq not in numid_seq_cl[au]:  # Set a default value for the second level of the dictionary
        numid_seq_cl[au][sq] = 0

    numid_seq_cl[au][sq] += 1

"EDIT: 添加了列表解决方案"

嘿,你的代码看起来不错。然而,我有一个问题要问,你的代码是如何工作的?当我们遇到if语句时,对我来说一切都变得模糊了。谢谢 :) - Alok
@Alok已经更新了答案并添加了注释。 - tituszban
@tituszban 谢谢您的回答。实际上,我需要一个列表而不是一个字典。 - user123892
@user123892 添加了列表解决方案。但是你真的应该使用字典。 - tituszban
1
@tituszban:我正在实现的软件基于一个标准,它需要一个列表来保存每个sequence_idau_typeid数量。我会联系那些正在开发这个标准的人,并向他们解释这个问题。感谢您提供的用零填充缺失索引的解决方案。 - user123892

1
在您的情况下,有意义的结果将是一个字典嵌套字典。
使用以下方法与灵活的 collections.defaultdict 对象:
from collections import defaultdict

list_of_dicts = [
    {'id': 0, 'au_type': 1, 'sequence_id': 0, 'AU_start_position': 0},
    {'id': 1, 'au_type': 1, 'sequence_id': 0, 'AU_start_position': 4095},
    {'id': 2, 'au_type': 1, 'sequence_id': 0, 'AU_start_position': 8092},
    {'id': 0, 'au_type': 3, 'sequence_id': 0, 'AU_start_position': 5678},
    {'id': 0, 'au_type': 1, 'sequence_id': 1, 'AU_start_position': 13525},
    {'id': 1, 'au_type': 1, 'sequence_id': 1, 'AU_start_position': 13587},
    {'id': 2, 'au_type': 1, 'sequence_id': 1, 'AU_start_position': 14576},
    {'id': 0, 'au_type': 3, 'sequence_id': 1, 'AU_start_position': 15019},
    {'id': 1, 'au_type': 3, 'sequence_id': 1, 'AU_start_position': 15560},
    {'id': 2, 'au_type': 3, 'sequence_id': 1, 'AU_start_position': 16004}
]

numid_seq_cl = defaultdict(lambda : defaultdict(int))  # default structure
for d in list_of_dicts:
    numid_seq_cl[d['sequence_id']][d['au_type']] += 1

numid_seq_cl = {k: dict(v) for k, v in numid_seq_cl.items()}
print(numid_seq_cl)  # {0: {1: 3, 3: 1}, 1: {1: 3, 3: 3}}

这里是你期望的索引:

编程相关:

print(numid_seq_cl[0][1])   # 3
print(numid_seq_cl[0][3])   # 1
print(numid_seq_cl[1][1])   # 3
print(numid_seq_cl[1][3])   # 3

谢谢您的回答,结果是正确的,但它是一个字典,而我实际上需要一个列表。 - user123892
@user123892,我猜你可能没有完全理解注意事项。如果您的输入列表中只有sequence_id = 3sequence_id = 5的字典,请发布预期输出列表结构。在您处理完后请告诉我。 - RomanPerekhrest
是的,我明白了。我太专注于寻找解决方案,没有意识到sequence_id和au_type中都没有后续索引。 - user123892

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接