【问题标题】:Is there a simple way to sort by numbers then by letters of amino acid in python有没有一种简单的方法可以在python中按数字然后按氨基酸字母排序
【发布时间】:2017-11-07 00:20:11
【问题描述】:

有没有一种简单的方法来按字母数字排序,但以数字递增,然后在下一个数字重新开始字母 是的,后跟大写字母,不带空格,最多为 5 位数字 python,氨基酸序列号?

在 Python 中我尝试过:

from natsort import natsort_keygen, ns
l1 = ['D1', 'E1', 'S1', 'S4', 'S6', 'C1', 'S2', 'D2', 'C2', 'E2', 'W373']
natsort_key1 = natsort_keygen(key=lambda y: y.lower())
l1.sort(key=natsort_key1)
l1

# Gives: 
['C1', 'C2', 'D1', 'D2', 'E1', 'E2', 'S1', 'S2', 'S4', 'S6', 'W373']

但我喜欢它:

['C1', 'D1', 'E1', 'S1', 'C2','D2', 'E2', 'S2', 'S4', 'S6', 'W373']

【问题讨论】:

  • 氨基酸可以有两个字母吗?
  • @GiantsLoveDeathMetal 请不要讽刺,不要让自己回答自己的问题。
  • @8protons 在这种情况下,恕我直言,不删除他的评论并自己回答是合法的。我不知道只有一个字母,原始问题中缺少信息,其他人可能也不知道,这对问题来说有点关键。
  • @bgse 好点,也许我推断他的两个 cmets 是错误的,鉴于两者之间有 7 分钟的间隔,我认为你是对的。对于可能的错误假设,我向 GiantsLoveDeathMetal 道歉。但是-我仍然认为第一条评论是不必要的,简单地说,“氨基酸不能有两个字母”就足够了。无论如何,评论是无关紧要的。 C1、C2、E1、E2 等是关于氨基酸蛋白结合区域、末端等的合法名称。
  • 我同意你们俩。

标签: python sorting alphanumeric


【解决方案1】:

你可以使用这种排序:

amino_acids = ['D1', 'E1', 'S1', 'S4', 'S6', 'C1', 'S2', 'D2', 'C2', 'E2', 'W373']

sorted_acids = sorted(
    amino_acids,
    key=lambda acid: (int(acid[1:]), acid[0])
)

应该没问题,因为Amino Acids 只有一个字母。

【讨论】:

  • 第4行变量名有错别字,应该是amino_acid
【解决方案2】:

可以使用python的sorted()函数

sorted(sorted(l1), key = lambda value:value[:1], value[0])

输出: ['C1', 'D1', 'E1', 'S1', 'C2', 'D2', 'E2', 'S2', 'S4', 'S6', 'W373']

【讨论】:

  • @GiantsLoveDeathMetal 是的,已更正,感谢您指出。
【解决方案3】:

如果我的理解是正确的,即氨基酸由一个字母后跟一个数字表示,那么以下应该可以解决问题。

from natsort import natsort_keygen, ns
l1 = ['D1', 'E1', 'S1', 'S4', 'S6', 'C1', 'S2', 'D2', 'C2', 'E2', 'W373']
for k, v in enumerate(l1):
    l1[k] = v[1:] + v[0]
natsort_key1 = natsort_keygen(key=lambda y: y.lower())
l1.sort(key=natsort_key1)
for k, v in enumerate(l1):
    l1[k] = v[-1] + v[:-1]
l1

这会将第一个字符排序到字符串的末尾,对其进行排序,然后将其带回来,这样就可以了。

同样,我对氨基酸知之甚少,第一个谷歌搜索结果表明只有一个字符后跟数字。我的回答就是基于这个假设

【讨论】:

  • 是的,它们(氨基酸)都是 1 个字母,后跟多达 5 个数字,没有空格。这些答案非常好,似乎效果很好。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
相关资源
最近更新 更多