0

我有一个嵌套列表理解,它创建了一个包含约 29,000 个项目的六个列表的列表。我正在尝试解析这个最终数据列表,并从中创建六个单独的字典。现在代码非常不合Python,我需要正确的语句来正确完成以下操作:

1.) 从单个语句创建六个字典。

2.) 缩放到任何长度的列表,即不对显示的计数器进行硬编码。

我遇到了多个问题,并尝试了以下方法:

1.) 使用 while 循环

2.) 使用 break 语句,会跳出最里面的循环,但不会正确创建其他字典。还打破由二进制开关设置的语句。

3.) 如果,否则条件为 n 个索引,索引从 1-29,000 迭代,然后重复。

请注意省略号表示为简洁而省略的代码。

# Parse csv files for samples, creating a dictionary of key, value pairs and multiple lists.
with open('genes_1') as f:
    cread_1 = list(csv.reader(f, delimiter = '\t'))
    sample_1_values = [j for i, j in (sorted([x for x in {i: float(j) 
                        for i, j in cread_1}.items()], key = lambda v: v[1]))]
    sample_1_genes = [i for i, j in (sorted([x for x in {i: float(j) 
                            for i, j in cread_1}.items()], key = lambda v: v[1]))]

... 

# Compute row means.
mean_values = []
for i, (a, b, c, d, e, f) in enumerate(zip(sample_1_values, sample_2_values, sample_3_values, sample_4_values, sample_5_values, sample_6_values)):
    mean_values.append((a + b + c + d + e + f)/6)

# Provide proper gene names for mean values and replace original data values by corresponding means.
sample_genes_list = [i for i in sample_1_genes, sample_2_genes, sample_3_genes, sample_4_genes, sample_5_genes, sample_6_genes]

sample_final_list = [sorted(zip(sg, mean_values)) for sg in sample_genes_list]

# Create multiple dictionaries from normalized values for each dataset.
class BreakIt(Exception): pass
try: 
    count = 1         
    for index, items in enumerate(sample_final_list):
        sample_1_dict_normalized = {}             
        for index, (genes, values) in enumerate(items):
            sample_1_dict_normalized[genes] = values
            count = count + 1
            if count == 29595:
                raise BreakIt
except BreakIt:
    pass

...

try: 
    count = 1         
    for index, items in enumerate(sample_final_list):
        sample_6_dict_normalized = {}             
        for index, (genes, values) in enumerate(items):
            if count > 147975:
                sample_6_dict_normalized[genes] = values
            count = count + 1
            if count == 177570:
                raise BreakIt
except BreakIt:
    pass

# Pull expression values to qualify overexpressed proteins.
print 'ERG values:'
print 'Sample 1:', round(sample_1_dict_normalized.get('ERG'), 3) 
print 'Sample 6:', round(sample_6_dict_normalized.get('ERG'), 3)  
4

2 回答 2

1

你的代码太长了,我无法给出确切的答案。我会很笼统地回答。

首先,您enumerate无缘无故地使用。如果您不需要索引值,则可能不需要枚举。

这部分:

with open('genes.csv') as f:
    cread_1 = list(csv.reader(f, delimiter = '\t'))
    sample_1_dict = {i: float(j) for i, j in cread_1}
    sample_1_list = [x for x in sample_1_dict.items()]
    sample_1_values_sorted = sorted(sample_1_list, key=lambda expvalues: expvalues[1])
    sample_1_genes = [i for i, j in sample_1_values_sorted]
    sample_1_values = [j for i, j in sample_1_values_sorted]
    sample_1_graph_raw = [float(j) for i, j in cread_1] 

应该是(a)使用list命名samples和(b)更短,因为您实际上并不需要立即从中提取所有这些信息sample_1_dict并移动它。它可以是这样的:

samples = [None] * 6
for k in range(6):
    with open('genes.csv') as f: #but something specific to k
        cread = list(csv.reader(f, delimiter = '\t'))
        samples[k] = {i: float(j) for i, j in cread}

之后,计算总和和平均值会更自然。

在这部分:

class BreakIt(Exception): pass
try: 
    count = 1         
    for index, items in enumerate(sample_final_list):
        sample_1_dict_normalized = {}             
        for index, (genes, values) in enumerate(items):
            sample_1_dict_normalized[genes] = values
            count = count + 1
            if count == 29595:
                raise BreakIt
except BreakIt:
    pass

您应该(a)迭代samples前面提到的列表,并且(b)根本不使用count,因为您可以自然地迭代samplessample[i].list或类似的东西。

于 2013-05-25T19:57:15.307 回答
0

您的代码有几个问题。你应该把你的代码放在每个最好做一件事的函数中。比您可以为每个样本调用一个函数而无需重复相同的代码六次(我认为这就是省略号所隐藏的内容。)。给每个函数一个自描述的名称和一个解释其作用的文档字符串。有很多不必要的代码。一旦你在函数中使用它,其中一些可能会变得很明显。例如,由于函数接受参数,因此您可以提交 29595。

于 2013-05-25T20:09:48.630 回答