List 动态创建python列表
我正在尝试动态创建python列表。我有两个文件,一个有键,另一个有键和值 密钥文件:File1:List 动态创建python列表,list,python-2.7,for-loop,List,Python 2.7,For Loop,我正在尝试动态创建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
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
我正在尝试将数据从文件1匹配到文件2,以创建如下列表。如果文件1.中有额外的键,则列表应包含该键的“nnnnnnn”
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
但它不起作用,我希望列表2包含列表的列表,但不完全确定您要问什么。我理解这个问题,您希望按照文件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']}
一些建议:
- 您可以使用字典在一行中创建
文件1\u dict
- 养成使用
打开文件的习惯,因为这样会在以后自动关闭文件和
- 文件对象是迭代器,所以一旦循环它们一次,它们就会耗尽(见下文)
- 不要对
中的每个项目循环file1\u dict
,只循环一次并检查该键是否在dict中;这也会更快,因为dict查找是O(1)file2
- 如果您确实只需要值,而不需要键,请使用
file1\u dict.values()
file1\u dict
中的每个键在File2
迭代器上进行迭代,但是在第一个键之后,迭代器将耗尽(请参阅以获取更多解释),因此您只获得dict中第一个键的匹配行
您可以使用
readlines
读取列表中的所有行,然后迭代此列表,或者使用seek(0)
重置文件,或者为每个键打开一个新的File2
迭代器,但最简单的方法是只迭代一次File2
,检查行是否在文件1\u dict
中。如果两个文件中的前两列始终相同,为什么需要文件1?
您希望如何将数据从文件1匹配到文件2
如果没有完全理解你的问题,我无法真正回答,但这里有一个方法
从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]
您需要文件1和文件2的前两列做什么?无法从所需的输出中看到这一点。抱歉。我编辑过。我想使用file1作为键来搜索file2并创建第3列的列表。谢谢。我想知道为什么我的代码不起作用。因为有时候,密钥文件包含文件2中可能不存在的额外密钥…其中我想打印垃圾值…@gthmgeeky如果我的答案和结尾添加的段落不清楚,请更具体地说明实际问题是什么。这个“垃圾价值”应该是什么样子?请用这两个输入文件和预期输出的全面、有代表性的示例更新您的问题。我已编辑。文件1中的额外密钥。。“abc_506\t56789.”应获得“nnn”。{'abc_506\t105152':['otherInfo','otherInfo','otherInfo','otherInfo','otherInfo','abc_506\t30319':['SomeInfo','SomeInfo','SomeInfo','SomeInfo','SomeInfo','SomeInfo','SomeInfo','abc_506\t56789':['nnnnnnnnnnnn]}@gthmgeky将空列表作为“垃圾值”有什么错对于文件1中的项目,在文件2中没有对应关系?这是我正在编写的一段代码。但这应该没问题。今天我学到了一个关于“文件对象是迭代器,一旦循环,它们就会耗尽”的重要一课。Perl中并非如此,我一直在思考这一部分……非常感谢。在文件1中会有一些额外的键,,……但在文件2中可能不存在