在Python中匹配多个数据集的字符串

时间:2011-12-12 11:31:16

标签: python

我正在研究python,我需要匹配几个数据文件的字符串。首先,我使用pickle来解压缩文件,然后将它们放入列表中。我只想匹配具有相同条件的字符串。这个条件显示在字符串的末尾。

我的工作脚本看起来大致如下:

import pickle

f = open("data_a.dat")
list_a = pickle.load( f )
f.close()

f = open("data_b.dat")
list_b = pickle.load( f )
f.close()

f = open("data_c.dat")
list_c = pickle.load( f )
f.close()

f = open("data_d.dat")
list_d = pickle.load( f )
f.close()


for a in list_a:
    for b in list_b:
        for c in list_c
            for d in list_d:
                 if a.GetName()[12:] in b.GetName(): 
                      if a.GetName[12:] in c.GetName():
                         if a.GetName[12:] in d.GetName():
                              "do whatever"

这似乎适用于这两个列表。当我尝试添加更多8或9个以上的数据文件时,问题就开始了,我还需要匹配相同的条件。简单的脚本不会处理,它会卡住。感谢您的帮助。

编辑:每个列表都包含以用于创建它们的参数命名的直方图。直方图的名称包含这些参数及其在字符串末尾的值。在这个例子中,我为2个数据集做了它,现在我想在没有使用多个循环的情况下为9个数据集做到这一点。

编辑2.我只是扩展了代码,以更准确地反映我想要做的事情。现在,如果我尝试为9个列表执行此操作,它不仅看起来很糟糕,而且也不起作用。

3 个答案:

答案 0 :(得分:0)

我不在乎:

files = ["file_a", "file_b", "file_c"]
sets = []

for f in files:
    f = open("data_a.dat")
    sets.append(set(pickle.load(f)))
    f.close()

intersection = sets[0].intersection(*sets[1:])

编辑:我忽略了你对x.GetName()[12:]的映射,但你应该能够减少你的问题来设置逻辑。

答案 1 :(得分:0)

这里有一小段你可以启发的代码。主要思想是使用递归函数。

为了简单起见,我承认我已经在列表中加载了数据,但您可以在之前从文件中获取数据:

data_files = [
    'data_a.dat',
    'data_b.dat',
    'data_c.dat',
    'data_d.dat',
    'data_e.dat',
]

lists = [pickle.load(open(f)) for f in data_files]

因为并没有真正了解你真正需要做什么的细节,我的目标是找到四个第一个字符的匹配:

def do_wathever(string):
    print "I have match the string '%s'" % string

lists = [
    ["hello", "world", "how", "grown", "you", "today", "?"],
    ["growl", "is", "a", "now", "on", "appstore", "too bad"],
    ["I", "wish", "I", "grow", "Magnum", "mustache", "don't you?"],
]

positions = [0 for i in range(len(lists))]

def recursive_match(positions, lists):
    strings = map(lambda p, l: l[p], positions, lists)
    match = True
    searched_string = strings.pop(0)[:4]
    for string in strings:
        if searched_string not in string:
            match = False
            break
    if match:
        do_wathever(searched_string)


    # increment positions:
    new_positions = positions[:]
    lists_len = len(lists)
    for i, l in enumerate(reversed(lists)):
        max_position = len(l)-1
        list_index = lists_len - i - 1
        current_position = positions[list_index]
        if max_position > current_position:
            new_positions[list_index] += 1
            break
        else:
            new_positions[list_index] = 0
            continue

    return new_positions, not any(new_positions)


search_is_finished = False

while not search_is_finished:
    positions, search_is_finished = recursive_match(positions, lists)

当然你可以在这里优化很多东西,这是草案代码,但是看看recursive function,这是一个主要的概念。

答案 2 :(得分:0)

最后我最终使用了内置功能的地图。我现在意识到我应该比我更明确(我将来会做的)。

我的数据文件是包含5个参数的直方图,有些是3或4.有类似的东西,

par1=["list with some values"]
par2=["list with some values"]
par3=["list with some values"]
par4=["list with some values"]
par5=["list with some values"]

我需要检查为参数值的每个可能组合绘制的数量的行为。最后,我得到一个数据文件,其中有300个直方图,每个直方图都在其名称中标明了相应的参数值和样本名称。它看起来像,

datasample1-par1=val1-par2=val2-par3=val3-par4=val4-par5=val5
datasample1-"permutation of the above values"
...
datasample9-par1=val1-par2=val2-par3=val3-par4=val4-par5=val5
datasample9-"permutation of the above values"    

因此,我为9个数据文件中的每一个获得了300个直方图,但幸运的是,所有这些直方图都以相同的顺序创建。因此,我可以使用内置函数的映射将所有这些配对。我解压缩数据文件,将每个文件放在列表中,并使用map函数将每个直方图与其他数据样本中的相应配置配对。

for lst in map(None, data1_histosli, data2_histosli, ...data9_histosli):  
  do_something(lst)

这解决了我的问题。谢谢大家的帮助!