我正在尝试动态创建python列表。我有两个文件,一个有密钥,另一个文件有密钥和值。
密钥文件:File1:
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 30319
abc_506 105152
abc_506 105152
abc_506 105152
abc_506 105152
abc_506 105152
abc_506 56789
abc_506 56789
文件2:
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 30319 SomeInfo
abc_506 105152 otherInfo
abc_506 105152 otherInfo
abc_506 105152 otherInfo
abc_506 105152 otherInfo
abc_506 105152 otherInfo
我正在尝试将file1中的数据与file2匹配,以创建如下所示的列表。如果file1中有额外的密钥,则列表中应包含" NNNNNNNNN"为那把钥匙。
list1=[['someInfo','someInfo','someInfo','someInfo','someInfo','someInfo','someInfo','someInfo','someInfo'],['OtherInfo','OtherInfo','OtherInfo','OtherInfo','OtherInfo'],["NNNNNNNNNNNNNNNNNNNN"]]
我正在尝试的是:
导入动力
File1=open("File1",'r')
File2=open("File2",'r')
File1_dict = {}
list2=[]
for line in File1:
line=line.strip()
File1_dict[line]=1
for keys in File1_dict.keys():
list1=[]
for line in File2:
fields=line.split("\t")
key=fields[0]+"\t"+fields[1]
if key==keys:
list1.append(fields[2])
else:
list1.append("NNNNNNNNNNNNNNNNNNNN")
list2.append(list1)
print list2
但是它不起作用我期待list2包含列表列表
答案 0 :(得分:0)
不完全确定你在问什么。据我所知,您希望通过文件1中的键对文件2中第三列中的元素进行分组。因此,如果密钥(文件2中的前两列)位于文件1中,则将第3列添加到那个小组。文件2中也可能存在行,文件1中没有对应的行,第三列中的值也不完全相同,否则这将更加简单......
尝试这样的事情:
with open("File1") as file1:
# create dict with all the keys from file 1
file1_dict = dict((line.strip(), []) for line in file1)
with open("File2") as file2:
# read lines from file 2
for line2 in map(str.strip, file2):
# split into key from file1 and value
key, val = line2.rsplit("\t", 1)
# if key is in file1
if key in file1_dict:
file1_dict[key].append(val)
print file1_dict
输出:
{'abc_506\t105152': ['otherInfo', 'otherInfo', 'otherInfo', 'otherInfo', 'otherInfo'],
'abc_506\t30319': ['SomeInfo', 'SomeInfo', 'SomeInfo', 'SomeInfo', 'SomeInfo', 'SomeInfo', 'SomeInfo', 'SomeInfo', 'SomeInfo']}
一些指示:
file1_dict
with
打开文件的习惯,因为这会自动关闭它们file2
中的每个项循环file1_dict
,只循环一次并检查该密钥是否在dict中;这也会更快,因为dict查找是O(1)file1_dict.values()
您的代码的问题与作为迭代器的文件有关:您尝试在File2
中为每个键迭代file1_dict
迭代器,但在第一个键之后,迭代器将耗尽(请参阅this related post有更多解释),所以你只得到dict中第一个键的匹配行。
您可以使用readlines
读取列表中的所有行,然后迭代此列表,或使用seek(0)
重置文件,或者为每个键打开一个新的File2
迭代器,但最简单的方法是迭代File2
一次,检查这些行是否在file1_dict
中。
答案 1 :(得分:0)
如果前两列在两个文件中始终相同,为什么需要file1? 您希望如何匹配file1到file2的数据?
如果不完全理解你的问题,我无法真正回答,但这是一种方式 从file2(从第3列)获取数据,并将其分组为相等的值。
from itertools import groupby
file2 = open("file2.txt", "r")
flat_list = map(get_third_column, file2.readlines())
grouped_list = [list(g) for _, g in groupby(flat_list)]
def get_third_column(line):
return line.split()[2]