Python 在字典上迭代列表以映射项

Python 在字典上迭代列表以映射项,python,numpy,dictionary,itertools,Python,Numpy,Dictionary,Itertools,我有两个文件,即: 文件1: 文件2: 我的预期产出是: 为此,我编写了以下代码: import numpy as np print("Reading Files...") header = open('File1', 'r') cl = header.readlines() infile = np.genfromtxt('File2', dtype='str', skip_header=1) new_array = [] for j in range(len(infile)): fo

我有两个文件,即:

文件1: 文件2: 我的预期产出是: 为此,我编写了以下代码:

import numpy as np
print("Reading Files...")
header = open('File1', 'r')
cl = header.readlines()
infile = np.genfromtxt('File2', dtype='str', skip_header=1)
new_array = []

for j in range(len(infile)):
    for row in cl:
        element = row.split("\t")
        ele_size = len(element)
        for i in range(0, ele_size):
            if np.core.defchararray.equal(infile[j,0], element[i]):
                clust = element[0]
                match1 = infile[j,0]
                match2 = infile[j,1]
                combo = "\t".join([clust, match1, match2])
                new_array.append(combo)

np.savetxt('output.txt',new_array, fmt='%s', delimiter='\t')
这就产生了我想要的输出。但是由于该文件在file2中有大约700000行和大约65000个集群,因此需要花费大量时间进行迭代。有人能提出一种有效的方法来解析它吗


是否可以将第一个文件保留为列表,第二个文件保留为字典?然后迭代键值?

您应该为File2存储一个dict,然后当您迭代File1中的行时,您可以在File2 dict中查找键值。这将意味着为循环存储一个级别的
,而不是为
循环存储三个级别的


我不认为NumPy能帮你解决这些问题——更容易忽略它,只编写常规Python。我认为它最终会非常快。

您可能想要的东西大致如下:

from collections import defaultdict

data1 = '''CL1 AA  XX  YY  ZZ  SS
CL2 3_b AA'''.split('\n')

data2 = '''AA  string1
AA  string2
3_b string3'''.split('\n')

# Store mappings that look like
#  * AA generates 'string1' and 'string2'
#  * 3_b generates 'string3'
mapping = defaultdict(list)
for line in data2:
    token, string = line.split() # you may need to change how you split the lines
    mapping[token].append(string)

result = []
# line -> CL1 AA  XX  YY  ZZ  SS
# element ^^^
# tokens      ^^  ^^  ^^  ^^  ^^
for line in data1:
    element, *tokens = line.split()
    for token in tokens[:2]: # you seem to only want 'match1' and 'match2'
        for string in mapping[token]:
            result.append([element, token, string])

for lst in result:
    print('\t'.join(lst))
基本上,您提前将“File2”的内容存储在字典中,这类似于:

{"AA": ["string1", "string2"], "3_b": ["string3"]}
然后在“File1”的每一行上循环;提取前三个成分;对于后两个,从预先生成的字典中找到相应的string*值


我同意其他用户的意见,认为numpy在这里不会非常有用。这可能只是增加了开销而没有真正的好处。

关于优化工作代码的问题将得到更好的答案,因为这不是NUMPY的用例问题在于,我的文件1包含非统一的数据。例如,第1行有6个条目,而第2行只有3个条目。当我阅读它时,我使用readlines,当我用tab拆分每个条目时,我得到一个大小为6的列表(它将每个空白作为一个元素计算)。我不明白为什么这是一个问题。只需迭代每行上的标记。不同的计数是可以的。
import numpy as np
print("Reading Files...")
header = open('File1', 'r')
cl = header.readlines()
infile = np.genfromtxt('File2', dtype='str', skip_header=1)
new_array = []

for j in range(len(infile)):
    for row in cl:
        element = row.split("\t")
        ele_size = len(element)
        for i in range(0, ele_size):
            if np.core.defchararray.equal(infile[j,0], element[i]):
                clust = element[0]
                match1 = infile[j,0]
                match2 = infile[j,1]
                combo = "\t".join([clust, match1, match2])
                new_array.append(combo)

np.savetxt('output.txt',new_array, fmt='%s', delimiter='\t')
from collections import defaultdict

data1 = '''CL1 AA  XX  YY  ZZ  SS
CL2 3_b AA'''.split('\n')

data2 = '''AA  string1
AA  string2
3_b string3'''.split('\n')

# Store mappings that look like
#  * AA generates 'string1' and 'string2'
#  * 3_b generates 'string3'
mapping = defaultdict(list)
for line in data2:
    token, string = line.split() # you may need to change how you split the lines
    mapping[token].append(string)

result = []
# line -> CL1 AA  XX  YY  ZZ  SS
# element ^^^
# tokens      ^^  ^^  ^^  ^^  ^^
for line in data1:
    element, *tokens = line.split()
    for token in tokens[:2]: # you seem to only want 'match1' and 'match2'
        for string in mapping[token]:
            result.append([element, token, string])

for lst in result:
    print('\t'.join(lst))
{"AA": ["string1", "string2"], "3_b": ["string3"]}