gpt4 book ai didi

python - 如何将两个大小未知的相关输入与变量链接起来

转载 作者:行者123 更新时间:2023-12-01 05:45:44 29 4
gpt4 key购买 nike

这是我的第一个Python脚本。我的数据如下所示:

Position ind1 ind2 ind3 ind4 ind5 ind5 ind7 ind8
0 C A C A A A A A
1 C A C C C A A A

但它的列数可能有所不同,并且有数千行。

我的脚本执行我需要的操作,逐行读取该文件,并计算每个位置 (POS) 中个体(以下简称总体)组合的 A 和 C 的频率。例如,A 在总体 1 的位置 0 处的频率(ind1、ind2、ind3、ind4);以及人口 2(ind5、ind6、ind7、ind8)中 A 在位置 0 处的频率,则 POS 1、2、3 .... 的频率相同。

为此,我通过以下代码在脚本中定义列(总体)的组合:

alleles1 = alleles[1:5]
alleles2 = alleles[5:]

但如果我有超过 9 列和不同的列组合,我需要随后修改等位基因* 和脚本的其余部分。

我想让我的程序更具交互性,用户定义人口数量并指定哪一列对应于哪个人口。

我到目前为止的代码:

#ask for the number of populations
try:
num_pop = int(raw_input("How many populations do you have? > "))
except ValueError:
print "In is not an integer! \nThe program exits...\n "
#ask for individuals in population
ind_pop = {}
for i in range(num_pop):
i += 1
ind_input = str(raw_input("Type column numbers of population %i > " % i))
ind_pop[i] = re.findall(r'[^,;\s]+', ind_input)

如果我有 2 个群体,其中第 3、5、6 列是群体 1,第 2、5 列是群体 2。它的工作方式如下:

> How many populations do you have? > 2
> Type column numbers of population 1 > 3, 5, 6
> Type column numbers of population 2 > 2, 4

输入存储在字典中。

{1: ['3', '5', '6'], 2: ['2', '4']}

问题是如何从该输入继续定义等位基因。输出应该是这样的:

allele1 =  [allele[3], allele[5], allele[6]]
allele2 = [allele[2], allele[4]]

如果有必要,这里是代码其余部分的主要部分:

with open('test_file.txt') as datafile:
next(datafile)
for line in datafile:
words = line.split() #splits string into the list of words
chr_pos = words[0:2] #select column chromosome and position
alleles = words[2:] # this and next separates alleles for populations

alleles1 = alleles[0:4]
alleles2 = alleles[4:8]
alleles3 = alleles[8:12]
alleles4 = alleles[12:16]

counter1=collections.Counter(alleles1)
counter2=collections.Counter(alleles1)
counter3=collections.Counter(alleles1)
counter4=collections.Counter(alleles1)
#### the rest of the code and some filters within the part above were spiked

最佳答案

您首先需要将列号转换为整数

    ind_pop[i] = [int(j) for j in re.findall(r'[^,;\s]+', ind_input)]

(我还将您的正则表达式更改为 r'\d+')

然后,不要使用 alleles1alleles2 等,而是使用主列表或字典:

master = {i: [alleles[j] for j in vals] for i, vals in ind_pop.items()}
counters = {i: collections.Counter(al) for i, al in master.items()}

然后您可以访问 counters[i] 而不是 counter1 等。

作为旁注,您可以通过将 ind_pop 放入列表中,使用 append 而不是保留计数器来简化上述所有内容

关于python - 如何将两个大小未知的相关输入与变量链接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204799/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com