我正在研究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个列表执行此操作,它不仅看起来很糟糕,而且也不起作用。
答案 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)
这解决了我的问题。谢谢大家的帮助!