【问题标题】:Rearrange strings in list alphabetically and by case按字母顺序和大小写重新排列列表中的字符串
【发布时间】:2015-07-23 14:37:34
【问题描述】:

我在for 循环中有一个列表,它使用itertools.product() 来查找不同的字母组合。我想使用collections.Counter() 来计算一个项目的出现次数,但是,现在它会打印“A”和“G”的所有不同组合:

['a', 'A', 'G', 'G']
['a', 'A', 'G', 'g']
['a', 'A', 'G', 'G']
['a', 'A', 'G', 'g']
['a', 'A', 'G', 'g']
#...
['a', 'G', 'A', 'G']
['a', 'G', 'a', 'g']
['a', 'G', 'A', 'G']
['a', 'G', 'a', 'G']
['a', 'G', 'a', 'G']
#...
['a', 'G', 'a', 'G']
['a', 'G', 'A', 'G']
['a', 'G', 'a', 'g']
['a', 'G', 'A', 'G']
['a', 'G', 'a', 'G']
#...
['a', 'G', 'A', 'G']
['a', 'G', 'a', 'G']
['a', 'G', 'a', 'G']
# etc.

现在,这还不是全部,但正如您所见,虽然顺序不同,但有些出现是相同的,例如:

['a', 'G', 'A', 'G']
['a', 'A', 'G', 'G']

我更喜欢后一种排序,所以我想找到一种方法来打印所有在小写字母之前的大写字母组合,并且因为“a”在“g”之前,也是按字母顺序排列的。最终产品应类似于['AaGG', 'aaGg', etc]。我应该使用什么功能?

这是生成数据的代码。标记为“计数”的部分是我遇到的问题。

import itertools
from collections import Counter
parent1 = 'aaGG'
parent2 = 'AaGg'
f1 = []
f1_ = []
genotypes = []
b = []
genetics = []
g = []
idx = []

parent1 = list(itertools.combinations(parent1, 2))    
del parent1[0]
del parent1[4] 

parent2 = list(itertools.combinations(parent2, 2))    
del parent2[0]
del parent2[4]


for x in parent1:
    f1.append(''.join(x))

for x in parent2:
    f1_.append(''.join(x))

y = list(itertools.product(f1, f1_))  

for x in y:
    genotypes.append(''.join(x))
    break
genotypes = [
        thingies[0][0] + thingies[1][0] + thingies[0][1] + thingies[1][1]
        for thingies in zip(parent1, parent2)
] * 4
print 'F1', Counter(genotypes)

# Counting
for genotype in genotypes:
    alleles = list(itertools.combinations(genotype,2))
    del alleles[1]
    del alleles[3]
    for x in alleles:
        g.append(''.join(x))

for idx in g:
    if idx.lower().count("a") == idx.lower().count("g") == 1:
        break                

f2 = list(itertools.product(g, g)) 

for x in f2:
    genetics.append(''.join(x)) 

for genes in genetics:
    if genes.lower().count("a") == genes.lower().count("g") == 2:
        genes = ''.join(genes)
    print Counter(genes)

【问题讨论】:

  • 您能否提供一个较小的样本输入及其预期输出?
  • @AshwiniChaudhary 我不是 100% 确定我明白你在问什么。你能解释一下吗

标签: python list genetics


【解决方案1】:

我认为您正在寻找一种自定义方式来定义优先级;这些列表目前按 ASCII 编号排序,它将大写字母定义为始终在小写字母之前。我会使用字典定义自定义优先级:

>>> test_list = ['a', 'A', 'g', 'G']
>>> precedence_dict = {'A':0, 'a':1, 'G':2,'g':3}
>>> test_list.sort(key=lambda x: precedence_dict[x])
>>> test_list
['A', 'a', 'G', 'g']

编辑: 你的最后几行:

for genes in genetics:
    if genes.lower().count("a") == genes.lower().count("g") == 2:
        genes = ''.join(genes)
    print Counter(genes)

没有做你想让他们做的事。

将这些行替换为:

precedence_dict = {'A':0, 'a':1, 'G':2,'g':3}

for i in xrange(len(genetics)):
    genetics[i] = list(genetics[i])
    genetics[i].sort(key=lambda x: precedence_dict[x])
    genetics[i] = ''.join(genetics[i])
from sets import Set

genetics = list(Set(genetics))
genetics.sort()

print genetics

我认为你有正确的解决方案。当在 for 循环中迭代 elements 时,Python 会复制该项目。所以字符串'genes'实际上并没有在原始列表中被修改。

【讨论】:

  • 嗯,我试过了,就像 abdi 的代码一样,它打印了“无无无无”。我认为我做错了什么,但我不确定是什么。有什么办法可以告诉我我在做什么或出了什么问题?我通常不会这样寻求帮助,但我需要完成这个项目今天
  • 遗传学是列表列表吗?
  • 是的。遗传学是 a 和 g 的所有不同组合的列表。每个组合都是它自己的列表,所以是的,遗传学是列表的列表。再次感谢您对此进行调查
  • 另外,它给了我错误: Traceback(最近一次调用最后一次):文件“Untitled.py”,第 73 行,在 test_list.sort(key = lambda x:precedence_dict[x ]) 文件“Untitled.py”,第 73 行,在 test_list.sort(key = lambda x:precedence_dict[x]) KeyError: 'aAaA'
  • 确保将正确的数据传递给排序函数。它应该是一个单独的字母值列表(如答案中的test_list,而不是所有连接的值列表。这可行,但如果在传递的字典中找不到元素,它将返回None作为优先级列表中的一个键;我认为是这样。
【解决方案2】:

我知道您没有要求进行代码审查,但您最好先按照您想要的顺序生成字符串,而不是在之后尝试过滤它们。这样的事情可能会奏效。

def cross(parent1, parent2):

    out = []
    alleles = len(parent1)/2

    # iterate parent 1 possible genotypes
    for i in range(2):

        # iterate loci 
        for k in range(alleles):
            child = []

            # iterate parent 2 possible genotypes
            for j in range(2):
                p1 = parent1[j * 2 + i]
                p2 = parent2[j * 2 + k]
                c = [p1, p2]

                # get each genotype pair into capitalization order
                c.sort()
                c.reverse()
                child += c

            out.append("".join(child))
    return out


if __name__ == "__main__":

    parent1 = 'aaGG'
    parent2 = 'AaGg'

    # F1
    f1 = cross(parent1, parent2)
    print f1

    # F2
    f2 = []
    for p1 in f1:
        for p2 in f1:
            f2 += cross(p1, p2)
    print f2

这是从单亲获取所有组合的一种方法。从空字符串开始,逐一添加可能性。

def get_all_combos(allele_pair, gametes):
# Take a list of of genotypes. Return an updated list with each possibility from an allele pair

    updated_gametes = []
    for z in gametes:
       updated_gametes.append(z + allele_pair[0])
       updated_gametes.append(z + allele_pair[1])
    return updated_gametes

if __name__ == "__main__":

    parent1 = 'aaGG'
    parent2 = 'AaGg'

    alleles = len(parent2)/2
    gametes = [""]
    for a in range(alleles):
        allele_pair = parent2[a*2:a*2+2]
        gametes = get_all_combos(allele_pair, gametes)
    print gametes

也许您可以弄清楚如何结合这两种解决方案来获得您想要的。

【讨论】:

  • 非常感谢您。我知道,我知道,我没有要求进行代码审查,因为我知道如果我这样做了,就会有人关闭它。但这对我帮助很大。可悲的是,我只能投赞成票。我不能给它检查,因为它只会帮助我,而不是其他人。但是,我想要的比你给我的要复杂。例如,在我正在做的事情中,有两个步骤,对于每个 F1/F2/F3 等等,首先我需要为每个人找到 a 和 g 的所有不同组合。例如,parent1 (aaGG) 将是 aG,aG。 aG,aG。然后我找到了所有的组合
  • (续)那些与其他父母组合。所以 F1 真的是 aG、aG、aG、aG 和 AG、Ag、aG、ag 的交叉。抱歉,如果这太令人困惑了。
  • 我刚刚更新了答案,举了一个例子,说明如何从一个父母那里获得所有组合。
  • 我知道这通常是不鼓励的,但我现在的时间非常紧迫,因为我过去一周一直在努力,今天我的实习结束了。你能解释一下如何把这些放在一起,因为我真的很困惑
  • 查看运行第二段代码时 zygotes 中的结果。 parent2 给出['AG', 'Ag', 'aG', 'ag']。试试 parent1。我不确定你需要用这些做什么,我仍然不完全理解你的目标。这可能会有所帮助:如果您有 p2 = ['AG', 'Ag', 'aG', 'ag']。您可以像 2D 列表一样索引它。所以p2[0] = 'aG'p2[0][0] = 'A' and p2[0][1] = 'G'。如果您获得父母双方的受精卵列表,您应该能够以您想要的任何格式获得组合。第一个交叉 AG X aG 将是 p1[0][0] + p2[0][0] + p1[1][0] + p2[1][1]
【解决方案3】:

您可以尝试使用排序功能。 我的意思的例子:

parent1 = "absdksakjcvjvugoh"
parent1sorted = list(parent1)
parent1sorted.sort()
print (parent1sorted)

你得到的结果是这样的:['a', 'a', 'b', 'c', 'd', 'g', 'h', 'j', 'j', 'k' , 'k', 'o', 's', 's', 'u', 'v', 'v']

这对你有帮助吗?

tldr: 将字符串转换为列表,排序列表

【讨论】:

  • 嗨阿卜迪!我只是尝试将其插入,但不是为父母做 t,因为我认为这会弄乱我的其余代码,而是将其插入基因。即:genes = ''.join(genes)geneslist = list.(genes)genessorted =geneslist.sort() 它返回“无无无无无...”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2015-05-07
相关资源
最近更新 更多