python - 使用 python defaultdict 对列表中的项目进行分组

标签 python defaultdict

我有一个名为“GO_file”的列表:

GO_file = ["A_1 12", "A_2 13", "A_3 14", "A_4 12", "B_1 1", "B_2 1", "B_3 5"]

我想将其转换为:

答:12、13、14

B:1, 5

from collections import defaultdict
GO_file = ["A_1 12", "A_2 13", "A_3 14", "A_4 12", "B_1 1", "B_2 1" "B_3 5"]

GO_dict = defaultdict(list)
for GO_names in GO_file:
   gene_id = GO_names.split("_")[0]
   GO_id = GO_names.split(" ")[1:]
   GO_dict[gene_id] = GO_id
print GO_dict    

但是,此代码仅附加键和一个值:

defaultdict(<type 'list'>, {'A': ['12'], 'B': ['5']})

我很感激任何建议。

最佳答案

您的代码几乎没有问题

  1. 您的 GO_ID 中有重复项,而您似乎只关心唯一性。所以你需要一个 defaultdict(set) 而不是 defaultdict(list)
  2. 用于生成键和值的拆分算法存在错误
  3. GO_dict[gene_id] = GO_id,只需将最后一个值分配给字典,而不是附加它。

可能的更正解决方案

>>> GO_dict = defaultdict(set)
>>> for GO_names in GO_file:
   gene_id,_,GO_id = GO_names.partition(" ")
   gene_id = gene_id.split("_")[0]
   GO_dict[gene_id].add(GO_id)


>>> print GO_dict
defaultdict(<type 'set'>, {'A': set(['13', '12', '14']), 'B': set(['1', '5'])})

上述代码可能存在的一个问题是,无法保证元素的顺序。不幸的是,默认库不提供 OrderedSet,但我们可以轻松自定义 OrderedDict 来满足我们的目的

>>> GO_dict = defaultdict(OrderedDict)
>>> for GO_names in GO_file:
   gene_id,_,GO_id = GO_names.partition(" ")
   gene_id = gene_id.split("_")[0]
   GO_dict[gene_id][GO_id] = None


>>> OrderedDict([('A', ['12', '13', '14']), ('B', ['1', '5'])])
OrderedDict([('A', ['12', '13', '14']), ('B', ['1', '5'])])

但是

在某些情况下,正如我所相信的,itertools 解决方案比使用 defaultdict 更优雅

>>> from itertools import groupby
>>> from operator import itemgetter
>>> GO_file_kv = [(key.split("_")[0], value) 
                   for key, value in (elem.split(" ") for elem in GO_file)]
>>> {key: OrderedDict.fromkeys([e for _, e in value]).keys()
     for key, value in groupby(sorted(GO_file_kv, key=itemgetter(0)),
                       key=itemgetter(0))
 }
{'A': ['12', '13', '14'], 'B': ['1', '5']} 

关于python - 使用 python defaultdict 对列表中的项目进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280151/

相关文章:

python - 通过双击运行 .py 不起作用

Python - 使用 defaultdict 制作自定义对象的字典

python - 如何在 Python 中遍历 defaultdict(list)?

python - python中小写字母排序

子进程返回码中的 Python 'return not' 语句

python - 使用 "in"运算符、方括号与大括号

列表中的python项目添加到字符串

python - 使用defaultdict搜索键/值

python - 双重嵌套defaultdict

python - 为什么 defaultdict default_factory 默认为 None?