我有一个以下格式的文件:
[s1,s2,s3,s4,...] SOME_TEXT
(per line)
例如:
[dog,cat,monkey] 1,2,3
[a,b,c,d,e,f] 13,4,6
包括括号。
假设我有另一个这样的字段,其中包含两行:
[banana,cat2,monkey2] 1,2,3
[a2,b2,c2,d,e,f] 13,4,6
我想获取此表单的两个文件,并按以下方式对齐:
[dog^banana,cat^cat2,monkey^monkey2] 1,2,3
[a^a2,b^b2,c^c2,d^d2,e^e2,f^f2] 13,4,6
同时确保相应行(例如1,2,3和13,4,6)中的“SOME TEXT”相同,并且每个对应行中括号中的元素数量相同。什么是快速紧凑的方式呢?
感谢。
答案 0 :(得分:3)
def read_file(fp,hash):
for l in fp:
p = l[1:].find(']')
k = l[p+3:-1]
v = l[1:p+1].split(",")
if k not in hash:
hash[k] = v
else:
hash[k] = zip(hash[k], v)
hash = {}
for fname in ('f1.txt', 'f2.txt'):
with open(fname) as fp:
read_file(fp, hash)
for k,v in hash.items():
print "[{0}] {1}".format(",".join("^".join(vv) for vv in v), k)
这是一种基本的方法,如果你按照阅读顺序需要文件中的行,你将需要做更多的工作。
这是我得到的输出:
[a^a2,b^b2,c^c2,d^d,e^e,f^f] 13,4,6
[dog^banana,cat^cat2,monkey^monkey2] 1,2,3
编辑:
这也假设每个key
即。 13,4,6在文件中出现一次。如果它可以出现多次,你将不得不将hash [k] = zip(hash [k],v)改为更精细的东西
if k not in hash:
hash[k] = [[vv] for vv in v]
else:
for i,vv in enumerate(v):
hash[k][i].append(vv)
答案 1 :(得分:0)
我会使用正则表达式来删除第一个]
之后的所有内容(并坚持下去)。然后另一个正则表达式将字符串分解为数组。然后针对合并来自不同文件的不同数组做任何你需要做的事情,然后将它们全部拼接在一起应该不会太难。我会将正则表达式作为练习留给读者: - )
答案 2 :(得分:0)
for l, m in zip(f1, f2):
l_head, l_tail = l.strip("[ ").split("]")
m_head, m_tail = m.strip("[ ").split("]")
l_head = l_head.split(",")
m_head = m_head.split(",")
assert len(l_head) == len(m_head)
l_tail = l_tail.split(",")
m_tail = m_tail.split(",")
assert len(l_tail) == len(m_tail)
...
我没有给你的变量好名字,因为我不知道它们是什么。我会给他们起一些更有用的东西。
我还没有编写重组线的代码。它不应该太难......