在python中编写几个嵌套for循环和if语句的简洁方法。

时间:2016-10-09 22:43:21

标签: python-3.x recursion multiprocessing nested-loops

我正在尝试读取“n”目录/数据文件,从每个目录中读取7列,然后使用之前读取的7列中的某些列检查n *(n-1)“if”语句是否为真。如果条件为真,那么做一些数学运算,否则什么都不做。

例如,如果我比较两个目录,那么我有2个“if”语句要测试,如果我有3个目录,那么我有6个“if”语句要检查。

每个目录大约有10,000行和大约40列,但它们的长度通常彼此不同。

目前,我有3个目录的工作代码,我将这三个目录读作嵌套for循环并应用我的6个条件。

以下是我的代码示例:

x

我有两个与此相关的问题:

  1. 我想将此概括为任意数量的目录。目前,如果我有2,3,4个令人讨厌的目录,我必须编辑代码。
  2. 2目录匹配最多需要33分钟才能执行,但3目录匹配代码目前已运行2天。有没有办法加快速度。
  3. 对于第一个问题,我查找了下面给出的链接中的递归函数,但我的问题是我可以使用它,因为我要检查的条件数也取决于“n”,并且列名在目录中通常不是同类的。例如:一个目录可能将Right Ascension称为'RA',另一个目录可能将其称为'ra'或'Right Ascension'。

    Basics of recursion in Python

    对于第二个问题,我试图在文档之后使用多处理。

    https://docs.python.org/2/library/multiprocessing.html

    如果我想进行多处理或尝试使用递归函数,我想知道是否更好地坚持嵌套for循环。任何意见,将不胜感激。

1 个答案:

答案 0 :(得分:1)

查找 itertools 包。这将为您提供一些迭代列列表的基本工具,并将列表长度指定为参数。是的,递归有助于解决组合,但是这个包将为你处理递归开销。

此应用程序所需的特定概念是7列的组合,一次 n 。为了便于说明,我们考虑7列,一次取3个:总共35个组合:7 * 6 * 5/3 * 2 * 1

你会得到一个生成器,这个函数将按照整理顺序返回35个组合中的每一个,一次一个。然后,您可以迭代它,就好像它是一个列表。对于每个组合,迭代成对列:

for col_list in combo_gen:
    for right in range (1, n):
        r_col = col_list[right]
        for left in range(right):
            l_col = col_list[left]
            # Compare l_col and r_col

这是该过程的基本概要。你能从这里拿走吗?