2010-03-02 129 views
1

我有两个文件,我加载到列表中。第一个文件的内容是这样的:比较Python中的两个列表项

d.complex.1 
23 
34 
56 
58 
68 
76 
. 
. 
. 
etc 
d.complex.179 
43 
34 
59 
69 
76 
. 
. 
. 
etc 

第二个文件的内容也是相同的,但具有不同的数值。请考虑从一个d.complex。*到另一个d.complex。*作为一个集合。

现在我有兴趣将一组第一个文件中的每个数值与第二个文件中各组的数值进行比较。我想记录每个数字出现在第二个文件中的次数。

例如,d.complex.1中的数字23可能在文件2中出现了5次不同的集合。我想要做的就是记录文件2中包含所有文件2的编号23的出现次数。

我最初的方法是将它们加载到列表中并进行比较,但我无法实现此目的。我在谷歌搜索,遇到集,但作为一个蟒蛇noob,我需要一些指导。谁能帮我?

如果您觉得问题不清楚,请告诉我。我也粘贴完整的文件1和文件2浏览:

http://pastebin.com/mwAWEcTa http://pastebin.com/DuXDDRYT

回答

1

首先创建其中可以加载一个给定文件中的函数,你可能要保持个人组,也想算的发生每个数字,最好是有一个整个文件的字典,其中的键是设置名称,例如complex.1等,为每个这样的组保持另一个字典中数字的设定,下面的代码说明它更好

def file_loader(f): 
    file_dict = {} 
    current_set = None 
    for line in f: 
     if line.startswith('d.complex'): 
      file_dict[line] = current_set = {} 
      continue 

     if current_set is not None: 
      current_set[line] = current_set.get(line, 0) 

    return file_dict 

现在你可以很容易地编写一个函数,将给出file_dict算一个数

def count_number(file_dict, num): 
    count = 0 
    for set_name, number_set in file_dict.iteritems(): 
     count += number_set.get(num, 0) 

    return count 

例如这里是一个使用例

s = """d.complex.1 
10 
11 
12 
10 
11 
12""" 

file_dict = file_loader(s.split("\n")) 
print file_dict 
print count_number(file_dict, '10') 

输出是:

{'d.complex.1': {'11': 2, '10': 2, '12': 2}} 
2 

您可能必须改进文件加载器,例如跳过空行,转换为int等

+0

那么,如果它是一个文件,我的任务会很容易,但我必须比较两个列表:( – forextremejunk 2010-03-02 15:36:42

+0

我不明白,为什么你不能加载这两个文件,得到他们的字典,做你所做的一切想要用那些词典,比较,统计整数,相交集等等 – 2010-03-03 03:34:25

2

使用Python的open函数打开文件,然后迭代所有行。检查该行是否包含数字,如果是,则按照here所述的方法在defaultdict实例中增加其计数。

对其他文件重复此操作并比较得到的字符。