Python 从嵌套for循环中的单个迭代器创建多个字典

Python 从嵌套for循环中的单个迭代器创建多个字典,python,Python,我有一个嵌套的列表理解,它创建了一个包含6个约29000项的列表。我试图解析这个最终数据列表,并从中创建六个独立的字典。现在代码非常不和谐,我需要正确的语句来正确完成以下任务: 1.)从一条语句创建六个词典 2.)缩放到任何长度列表,即不硬编码如图所示的计数器 我遇到了多个问题,并尝试了以下方法: 1.)使用while循环 2.)使用break语句将中断最内部的循环,但不会正确创建其他字典。也可以使用二进制开关设置break语句 3.)如果,else条件为n个索引,则索引从1-29000迭代,然

我有一个嵌套的列表理解,它创建了一个包含6个约29000项的列表。我试图解析这个最终数据列表,并从中创建六个独立的字典。现在代码非常不和谐,我需要正确的语句来正确完成以下任务:

1.)从一条语句创建六个词典

2.)缩放到任何长度列表,即不硬编码如图所示的计数器

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

1.)使用while循环

2.)使用break语句将中断最内部的循环,但不会正确创建其他字典。也可以使用二进制开关设置break语句

3.)如果,else条件为n个索引,则索引从1-29000迭代,然后重复

请注意,省略号表示为简洁起见省略了代码

# 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


你的密码太长,我无法给出准确的答案。我会非常笼统地回答

首先,您无缘无故地使用
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)使用名为
samples
list
和(b)更短,因为您实际上不需要从
sample\u 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)迭代前面提到的
样本
列表,并且(b)根本不使用
计数
,因为您可以自然地迭代
样本
样本[i]。列表
或类似的东西。

您的代码有几个问题。您应该将代码放在函数中,最好每个函数只做一件事。这样,您就可以为每个示例调用一个函数,而无需将同一代码重复六次(我假设省略号隐藏了这一点)。给每个函数一个自我描述的名称和一个解释其功能的文档字符串。有很多不必要的代码。一旦在函数中有了它,其中一些可能会变得很明显。例如,由于函数采用参数,您可以提交29595。

我之前说过:如果可以使用列表,请不要创建单独的
sample\x…
变量。之所以使用Enumerate,是因为任何列表的解包都会产生值错误。第一个代码块已被修改。我需要一个文件打开列表、一个示例名称列表,以及一种方法,使每个cread对象能够在函数定义的本地范围之外使用,以将每个数据集代码块替换为稍后调用的单个函数。实际上,您只需要oredered
items()
的列表。在需要的时候,其他一切都可以从中提取。拆包不是个好主意;您可以使用列表和列表理解以及一个
sum()
来代替。使用Count是一种解决方法,因为迭代列表将重新启动enumerate使用的索引计数,正如在问题中一样,Count是最后的手段,因为我无法使用while循环和中断、其他方法获得正确或所需的代码,在我修改初始代码块之前,我已经标记了要删除的适度性,这本身就是另一个问题的另一个主题。照目前的情况,这个问题应该作为如何控制嵌套for循环中的索引操作的示例给出,同时提供更多的细节来说明我的确切问题,以及提到的其他问题。OK。异常是打破嵌套循环的一种方法。将其放入函数中并使用
return
的更好方法。
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