如何将单个列表中的某些项目分组?

时间:2017-01-09 10:14:25

标签: python

我有一个Python代码,可以根据您输入的亲生父母的两种基因型为后代生成基因型。 以下代码可以正常运行:http://freetexthost.com/tutjzff4ai

您输入了两种基因型(例如“EE aa”和“ee AA”,它输出“Ee Aa”。您还可以输入其他基因,但这并不重要,因为该部分可以正常工作。

目前有两种必需的基因类型(延伸和刺豚鼠)。

我需要它有第三种类型。我需要有第三种类型的“奶油”。我需要这个的原因是因为目前“Cr”和“prl”(当前在订单列表中)需要单独输入(nCr nprl),而它们实际上应该作为Crprl输入。 Cr和prl基因位于同一基因座上,因此当父母同时具有Cr和prl(Crpr1)时,它需要总是通过其中一个。如果你将它们分别作为nCr nprl输入,那么后代就不会同时接收它们,或者两者都没有,因为代码将它们作为两个不同的基因座读取。

列表应如下所示

cream = [“Cr”,“prl”]

可能的输入应该是nCr,CrCr,nprl,prlprl和Crprl

这是我到目前为止所做的,但它不起作用。 http://freetexthost.com/6160o0mk3e

1 个答案:

答案 0 :(得分:0)

我建议查看itertools模块。 这真的是你需要的东西。像这样使用它:

>>> import itertools
>>> cream = ["Cr","prl"]

>>> list(itertools.combinations(cream+["n"], 2))
[('Cr', 'prl'), ('Cr', 'n'), ('prl', 'n')]

>>> list(itertools.combinations_with_replacement(cream+["n"], 2))
[('Cr', 'Cr'), ('Cr', 'prl'), ('Cr', 'n'), ('prl', 'prl'), ('prl', 'n'), ('n', 'n')]

为不同的组合操作设置了非常好的方法。 如何迭代组合并轻松检查条件:

>>> for pair in itertools.combinations_with_replacement(cream+["n"], 2):
        print(pair)
        if ('Cr' in pair) or ('prl' in pair):
           print('Parent has on of them, so we have to ...')
        if ('Cr' in pair) and ('prl' in pair):
            print('Parent has both of them')

如何制作合并值列表并忽略不可能的值('nn')?这种所谓的“列表理解”遍历所有组合,检查任何特定组合是否有效(x != ('n', 'n'))。然后将有效组合作为字符串与''.join(x)连接,并返回此类字符串的列表。

 >>> [''.join(x) 
        for x in itertools.combinations_with_replacement(cream+["n"], 2) 
        if x != ('n', 'n')
     ]
['CrCr', 'Crprl', 'Crn', 'prlprl', 'prln']

定义值得查看Itertools Recipes