python - 通过两列连接两个数组并删除不需要的部分 PYTHON

标签 python arrays file concatenation

我想请你帮忙。首先我想介绍一下我的问题。 我有两个带有数组的文件,每个文件就像一个数组,每个单词之间都有空格。

First: [9 columns] 3columns are important
2001   5276    data3   data4   data5   data6   data7   data8   data9
2001   23243   data3   data4   data5   data6   data7   data8   data9
....   
2001   434343  data3   data4   data5   data6   data7   data8   data9
2002   233     data3   data4   data5   data6   data7   data8   data9
....   
2002   23232   data3   data4   data5   data6   data7   data8   data9

Second:[5 columns] 
2001   23243   data3'   data4'   data5'
2001   5276    data3'   data4'   data5'   
....   
2001   434343  data3'   data4'   data5'   
2002   23232   data3'   data4'   data5'   
....      
2002   233     data3'   data4'   data5' 

I would like to create one file from two above which will contain array as ex.:
2001   5276    data3   data3'   data4'   data5'
2001   23243   data3   data3'   data4'   data5'
....

我必须检查每个文件中前两列中的数据是否相等,然后将它们相加 :) 直到现在我已经找到了这个程序,但我不知道如何以正确的方式改变它

file2 = open('file2', 'r')
matrix1 = [line.rstrip().split(' ') for line in file1.readlines()]
matrix2 = [line.rstrip().split(' ') for line in file2.readlines()]
file1.close()
file2.close()

#combine
t_matrix1 = [[r[col] for r in matrix1] for col in range(len(matrix1[0]))]
t_matrix2 = [[r[col] for r in matrix2] for col in range(len(matrix2[0]))]
final_t_matrix = []
for i in (t_matrix1 + t_matrix2):
    if i not in final_t_matrix:
        final_t_matrix.append(i)
final_matrix = [[r[col] for r in final_t_matrix] for col in    range(len(final_t_matrix[0]))]

#output
outfile = open('out.txt', 'w')
for i in final_matrix:               
    for j in i[:-1]:
        outfile.write(j+', ')
    outfile.write(i[-1]+'\n')
outfile.close()

最佳答案

这里你想要的是一个字典,将每行的前两列从 First 映射到整行。这样,当您通过 Second 时,您可以查找前两列,并附加到您在那里找到的行。

有几个问题需要回答才能准确地确定哪种字典:

  • 行的顺序是否必须与它们在 First 中的顺序相同?
  • 如果 Second 中的行与 First 中的行不匹配,会发生什么情况?
  • 反之亦然?
  • 如果任一文件中的前两列相同有多行怎么办?

假设答案是“不,不会发生,不会发生,不会发生”。然后你可以使用一个简单的dict:

with open('file1') as file1:
    lines = (line.rstrip().split() for line in file1)
    rows = {tuple(line[:2]): line[:3] for line in lines}

with open('file2') as file2:
    for line in file2:
        row = line.rstrip().split()
        rows[tuple(row[:2])].append(row[2:])

with open('out.txt', 'w') as outfile:
    for row in rows:
        outfile.write(', '.join(row) + '\n')

如果我把第一部分写得更清楚一些,对于新手来说可能会更容易理解一些,所以让我这样做:

rows = {}
with open('file1') as file1:
    for line in file1:
        row = line.rstrip().split()
        first_two_columns = tuple(line[:2])
        first_three_columns = line[:3]
        rows[first_two_columns] = first_three_columns

我做了一些其他的简化:

  • 使用 with 语句避免必须调用 close
  • 不要使用readlines;一个文件已经是一个可迭代的行,您所做的就是让 Python 将整个文件读入内存,然后在您可以开始处理这些行之前将其拆分成更多内存中的行。
  • split() 拆分任何空格,这可能是您在这里想要的,而不是 split(' '),它只拆分空格字符。
  • ', '.join(i) 为您提供 i 的所有成员,每对之间有 ', ',与您在内部循环中所做的相同。

关于python - 通过两列连接两个数组并删除不需要的部分 PYTHON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26984852/

相关文章:

python - 在两个模块中使用cherrypy,但只有一个cherrypy实例

python - 如何在 Python 中执行二分法

python - 如何在Python中将交互式提示与argparse结合起来?

python - 应用于列表的乘法运算符(数据结构)

javascript - 在二维数组中分配值时遇到问题

arrays - 两个数组所有可能乘积中的第 k 个最大元素

php - 从 $_POST 数组多次 INSERT INTO MySQL

java - 需要分块下载大文件

java - 多个Java进程可以同时读取同一个文件吗?

Android:永久保存文件(即使在清除数据/卸载后)