首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中进行子排序?

问如何在python中进行子排序?
EN

Stack Overflow用户
提问于 2013-01-19 17:03:42
回答 3查看 1.2K关注 0票数 1

非常感谢SO社区帮助我解决以前遇到的问题。我喜欢这里的帮助!

我现在还有一个问题。我有一个完整的DNA序列列表,这些序列与“构造号”和“部件号”相关。目前的情况是,从我以前的代码来看,我把它作为一个csv文件打开、读取和导入,作为一个字典对象列表。所有的东西都已经按照“构造号”排序了,但我需要按照“部件号”进行排序。(这有点像在Excel中,他们说“先按顺序排序,然后再按_排序”。

有人知道怎么做吗?到目前为止,我所写的只是:

代码语言:javascript
复制
primers_list = open('primers-list.csv', 'rU')
primers_unsorted = csv.DictReader(primers_list)
for row in primers_unsorted:
    print(row)

到目前为止,输出的一个子集如下所示,用于可视化我正在处理的数据:

代码语言:javascript
复制
{' Direction': 'fw primer', ' Construct Number': '1', ' Part Number': '2', 'Primer Sequence': 'AAGCGGCCGCTCGAGTCTAAgctcactcaaaggcggtaatcagataaaaaaaatccttag'}
{' Direction': 're primer', ' Construct Number': '1', ' Part Number': '1', 'Primer Sequence': 'attaccgcctttgagtgagcTTAGACTCGAGCGGCCGCTTTTTGACACCAGACCAACTGG'}
{' Direction': 'fw primer', ' Construct Number': '1', ' Part Number': '1', 'Primer Sequence': 'TTTAATTACTAACTTTATCTATGATAGATCCCGTCGTTTTACAACGTCGTGACTGGGAAA'}
{' Direction': 're primer', ' Construct Number': '1', ' Part Number': '2', 'Primer Sequence': 'AAAACGACGGGATCTATCATAGATAAAGTTAGTAATTAAACTTAAAAGTTGTTTAATGTC'}
{' Direction': 'fw primer', ' Construct Number': '2', ' Part Number': '2', 'Primer Sequence': 'gtaaatccaagttgtaataatactagagTAGCATAACCCCTTGGGGCCTCTAAACGGGTC'}
{' Direction': 're primer', ' Construct Number': '2', ' Part Number': '1', 'Primer Sequence': 'GGGGTTATGCTActctagtattattacaacttggatttaccacctttcttcgccttgatc'}
{' Direction': 'fw primer', ' Construct Number': '2', ' Part Number': '1', 'Primer Sequence': 'TACGACTCACTATAGGGAGAtactagagttaaggaggtaaaaaaaatgggtccggtcgtt'}
{' Direction': 're primer', ' Construct Number': '2', ' Part Number': '2', 'Primer Sequence': 'ttacctccttaactctagtaTCTCCCTATAGTGAGTCGTATTACTCTAGAAGCGGCCGCg'}
{' Direction': 'fw primer', ' Construct Number': '3', ' Part Number': '2', 'Primer Sequence': 'gtaaatccaagttgtaataatactagagTAGCATAACCCCTTGGGGCCTCTAAACGGGTC'}
{' Direction': 're primer', ' Construct Number': '3', ' Part Number': '1', 'Primer Sequence': 'GGGGTTATGCTActctagtattattacaacttggatttaccacctttcttcgccttgatc'}
{' Direction': 'fw primer', ' Construct Number': '3', ' Part Number': '1', 'Primer Sequence': 'TAACTATCACTATAGGGAGAtactagagttaaggaggtaaaaaaaatgggtccggtcgtt'}
{' Direction': 're primer', ' Construct Number': '3', ' Part Number': '2', 'Primer Sequence': 'ttacctccttaactctagtaTCTCCCTATAGTGATAGTTATTACTCTAGAAGCGGCCGCg'}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-19 17:16:00

另一种方式是:

代码语言:javascript
复制
import operator
primers_unsorted.sort(key=operator.itemgetter(' Construct Number', ' Part Number'))

for row in primers_unsorted:
    print(row)
票数 5
EN

Stack Overflow用户

发布于 2013-01-19 17:23:33

如果您想逐块地执行此操作,可以执行以下操作:

代码语言:javascript
复制
a=0
while a<len(primers_list):
    b=a
    current_construct=primers_list['Construct Number']
    while primers_list[b]['Construct Number']==current_construct:
         b=b+1
    primers_list[a:b]=sorted( primers_list[a:b] , key = lambda e: (e[' Construct Number'],e[' Part Number']))
    a=b

如果列表很长的话可能会很有用。

票数 1
EN

Stack Overflow用户

发布于 2013-01-21 16:46:51

我的最后一段代码是这样的,它完美地完成了:

代码语言:javascript
复制
primers_list = open('primers-list.csv', 'rU')
primers_unsorted = csv.DictReader(primers_list)
primers_sorted = sorted(primers_unsorted, key=operator.itemgetter('Construct Number', 'Part Number'))
for row in primers_sorted:
    print(row)

这其中的关键(请原谅双关语)是使用operator.itemgetter(.),它根据需要接受尽可能多的参数。它以排序(.)的形式传递给'key‘参数。

非常感谢Eric回答我的问题!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14416652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档