python中的合并列表重复添加元素

时间:2016-11-08 12:24:01

标签: python list append

我有一个问题,我有两个文件,每个都有两列,一个是T,第二列是一个函数,取决于T.我想合并它们,并将它们都写在输出文件中,为此我正在使用以下(由于某些原因使用T = T1 + T2不起作用,这就是我使用扩展的原因)。

T1 = column1_of_file1
Y1 = column2_of_file1
T2 = column1_of_file2
Y2 = column2_of_file2

Total_T = []
Total_Y = []
Total_T.extend(T1)
Total_T.extend(T2)
Total_Y.extend(Y1)
Total_Y.extend(Y2)

我遇到的问题是T1中的元素与T2的元素相同。 T1从1开始,在4中结束,我列在两列的最后7个元素下面:

# T1       Y1
 ...        ...
3.76    -25.8529    
3.80    -25.8474   
3.84    -25.8422  
3.88    -25.8356  
3.92    -25.8286  
3.96    -25.8133 
4.00    -25.7997   

并且T2以值3.80开始并且运行到8,但是相应的 Y2的值不同:

#T2        Y2
3.80    -25.7331
3.84    -25.0383
3.88    -24.4059
3.92    -23.8288
3.96    -23.3027 
4.00    -22.8242  
4.04    -22.3917 
...       ...

我想要的是合并两个列表,删除T中重复的元素 (我知道如何在T2删除时只为T1做一个)但是因为值 在Y是不同的我想要添加它们,以便最终T_total和 Y_total看起来像:

#T_total    Y_total
3.80        Y1[3.80] + Y2[3.80] 
3.84        Y1[3.84] + Y2[3.84]
3.88        Y1[3.88] + Y2[3.88]
3.92        Y1[3.92] + Y2[3.92]
3.96        Y1[3.96] + Y2[3.96]
4.00        Y1[4.00] + Y2[4.00]

有什么想法吗? T1和T2的长度不同,因此Y1,Y2的长度也不同。

2 个答案:

答案 0 :(得分:0)

您可以使用collections.defaultdict

执行此操作

保持y1和y2的值

假设你想要一个y1和y2的列表,这个有效:

.ui-autocomplete { width: 1%; }

输出

from collections import defaultdict

text1='''3.76    -25.8529
3.80    -25.8474
3.84    -25.8422
3.88    -25.8356
3.92    -25.8286
3.96    -25.8133
4.00    -25.7997 '''
text2 = '''3.80    -25.7331
3.84    -25.0383
3.88    -24.4059
3.92    -23.8288
3.96    -23.3027
4.00    -22.8242
4.04    -22.3917'''
f1 = {line.split()[0] : line.split()[1] for line in text1.splitlines()}
f2 = {line.split()[0] : line.split()[1] for line in text2.splitlines()}
f_total = defaultdict(list)
for key,value in f1.items():
    f_total[key].append(value)
for key,value in f2.items():
    f_total[key].append(value)
print (f_total)

聚合

如果您只想添加它们,只需将defaultdict(<class 'list'>, { '3.76': ['-25.8529'], '4.00': ['-25.7997', '-22.8242'], '4.04': ['-22.3917'], '3.80': ['-25.8474', '-25.7331'], '3.88': ['-25.8356', '-24.4059'], '3.92': ['-25.8286', '-23.8288'], '3.84': ['-25.8422', '-25.0383'], '3.96': ['-25.8133', '-23.3027']}) 类型更改为defaultdict

float

输出

f1 = {line.split()[0] : float(line.split()[1]) for line in text1.splitlines()}
f2 = {line.split()[0] : float(line.split()[1]) for line in text2.splitlines()}
f_total = defaultdict(float)
for key,value in f1.items():
    f_total[key]+=value
for key,value in f2.items():
    f_total[key]+=value
print (f_total)

答案 1 :(得分:0)

如果您愿意使用pandas,请尝试以下操作(我假设您的数据是以制表符分隔的。)

import pandas as pd
df1 = pd.read_table('file1.dat', names=['T','Y1'], index_col='T')
df2 = pd.read_table('file2.dat', names=['T','Y2'], index_col='T')
result = pd.concat([df1, df2], axis=1).dropna()
result['Y_total'] = result.Y1 + result.Y2
print(result)

使用您的测试数据,会产生以下输出:

           Y1       Y2  Y_total
T                              
3.80 -25.8474 -25.7331 -51.5805
3.84 -25.8422 -25.0383 -50.8805
3.88 -25.8356 -24.4059 -50.2415
3.92 -25.8286 -23.8288 -49.6574
3.96 -25.8133 -23.3027 -49.1160
4.00 -25.7997 -22.8242 -48.6239

最后,如果你只想要一个带有&#39; Y_total&#39;的数据框架。专栏,使用:

result.loc[:, ['Y_total']]