【问题标题】:Nested for loop to search 2 lists嵌套 for 循环以搜索 2 个列表
【发布时间】:2011-08-04 17:23:08
【问题描述】:

使用:Python 2.4

目前,我有一个嵌套的 for 循环,它遍历 2 个列表并根据两个列表中存在的两个元素进行匹配。一旦找到匹配项,它就会从 r120Final 列表中取出元素,并将其放入一个名为“r120Delta”的新列表中:

for r120item in r120Final:
    for spectraItem in spectraFinal:
    if(str(spectraItem[0]) == r120item[2].strip()) and (str(spectraItem[25]) == r120item[10]):
        r120Delta.append(r120item)
        break

问题是这太慢了,而且列表没有那么深。 R120 约 64,000 行,Spectra 约 150,000 行。

r120Final 列表是一个嵌套数组,看起来像这样:

r120Final[0] = [['xxx','xxx','12345','xxx','xxx','xxx','xxx','xxx','xxx','xxx','234567']]
...
r120Final[n] = [['xxx','xxx','99999','xxx','xxx','xxx','xxx','xxx','xxx','xxx','678901']]

spectralFinal 列表本质上是相同的,一个嵌套数组,看起来像这样:

spectraFinal[0] = [['12345','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','234567']]
...
spectraFinal[0] = [['99999','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','678901']]

最后,“r120Delta”的原因是这样我就可以在 r120Final 和 r120Delta 之间进行列表差异,并检索不匹配的 r120 数据元素。这是我为这个任务定义的函数,而且速度很慢:

def listDiff( diffList, completeList ):
    returnList = []
        for completeItem in completeList:
            if not completeItem  in diffList:
                returnList.append(completeItem)
    return returnList

基本上,我精通 Python,但绝不是专家。我正在寻找一些专家来告诉我如何加快速度。任何帮助表示赞赏!

【问题讨论】:

  • r120Final 和spectralFinal 是两个不同的文件,其中每个列表项都是文件中的一行吗?如果是这样,我可以向您展示如何使用命令行快速完成此操作。

标签: python search string-matching nested-loops nested-lists


【解决方案1】:
spectra_set = set((str(spectraItem[0]), str(spectraItem[25])) for spectraItem in spectraFinal)

returnList = []
for r120item in r120Final:
    if (r120item[2].strip(), r120item[10]) not in spectra_set:
       returnList.append(r120item)

这会将所有不匹配的项目添加到returnList

你可以在一行中完成(如果你真的想要的话)

returnList = [r120item for r120item in r120Final 
                 if (r120item[2].strip(), r120item[10]) not in 
                     set((str(spectraItem[0]), str(spectraItem[25])) 
                         for spectraItem in spectraFinal)]

如果您需要完整的spectraItem

spectra_dict = dict(((str(spectraItem[0]), str(spectraItem[25])), spectraItem) for spectraItem in spectraFinal)
returnList = []
for r120item in r120Final:
    key = (r120item[2].strip(), r120item[10])
    if key not in spectra_dict:
        returnList.append(r120item)
    else:
        return_item = some_function_of(r120item, spectra_dict[key])
        returnList.append(return_item)

【讨论】:

  • 您可能还想研究一下 Numpy (numpy.scipy.org),它对切片和切块多维数组有一些很好的支持。
  • 哇,这帮了大忙……很多!
  • 现在,我将如何使用它来匹配两个列表中的元素并合并它们?说,一旦找到匹配项,我想将 r120Final 数据元素和一些选择的spectraFinal 元素合并在一起,例如spectrumFinal[8]、spectrumFinal[5]、spectrumFinal[2] 和spectrumFinal[23]?
  • 已编辑以显示如何以接近相同的速度访问完整的spectraItem,我认为这就是您的意思。
  • 这绝对有帮助,但是如果我想要像上面提到的那样选择光谱项目,你能指出我吗?那会打到它的头上。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
相关资源
最近更新 更多