在Python中比较两个列表项

1 投票
2 回答
1514 浏览
提问于 2025-04-15 19:55

我有两个文件,已经把它们的内容加载到列表里。第一个文件的内容大概是这样的:

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

第二个文件的内容也是类似的,只是数字值不同。请把从一个 d.complex.* 到另一个 d.complex.* 的部分看作一组。

现在我想比较第一文件中每组的数字值和第二文件中每组的数字值。我想记录每个数字在第二文件中出现的次数。

举个例子,数字 23 在 d.complex.1 中可能在第二文件的不同组里出现了 5 次。我只想记录数字 23 在第二文件中出现的总次数,包括所有组。

我最开始的想法是把它们加载到列表中进行比较,但我没能做到。我在谷歌上查找了一下,发现了集合这个概念,但作为一个 Python 新手,我需要一些指导。有人能帮我吗?

如果你觉得我的问题不清楚,请告诉我。我也把文件 1 和文件 2 的完整内容贴在这里:

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

2 个回答

2

首先,用Python的 open 函数打开文件,然后逐行读取文件的内容。接着,检查每一行是否包含数字,如果有,就在一个 defaultdict 实例中增加这个数字的计数,具体方法可以参考 这里

对另一个文件也做同样的操作,然后比较这两个字典的结果。

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

现在你可以很容易地写一个函数,来统计在给定的文件字典中某个数字的出现次数。

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

你可能需要改进文件加载的功能,比如跳过空行,或者将字符串转换为整数等等。

撰写回答