List 动态创建python列表

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

我正在尝试动态创建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
我正在尝试将数据从文件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
    中的每个项目循环
    file2
    ,只循环一次并检查该键是否在dict中;这也会更快,因为dict查找是O(1)
  • 如果您确实只需要值,而不需要键,请使用
    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中可能不存在