动态创建python列表

时间:2014-08-09 10:52:54

标签: 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        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包含列表列表

2 个答案:

答案 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]