计算两个文件中公共集的数目

2024-10-16 20:41:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想得到你的帮助,在写一个脚本来计算两个文件中常见的数字集的数目。我的文件格式如下所示

文件1

0: 152 145 148
1: 251 280 428
2: 42 281 407
3: 289 292 331
4: 309 212 226
5: 339 336 376
6: 339 376 380
7: 41 406 205
8: 237 418 193

文件2

0: 251 280 428
1: 309 212 226
2: 339 336 376
3: 339 376 380
4: 420 414 199
5: 418 193 237
6: 203 195 200
7: 287 161 257
8: 287 257 158
9: 263 369 15
10: 285 323 327

第一列只是序列号,在检查两个文件之间的匹配时应忽略,具有不同顺序的相同数字集应计为公共数字(for e.g 237 418 193 = 418 193 237)

在这种情况下,预期结果将是。。。。。你知道吗

5 # no. of common sets
251 280 428
309 212 226
339 336 376
339 376 380
237 418 193

我试过用awk脚本-

awk 'FNR==NR{a[$3]=$0;next}{if(b=a[$3]){print b}}' file1 file2

不幸的是,集合“237 418 193”不计算,因为它在第二个文件(418 193 237)中的顺序不同。你知道吗

有谁能帮我用awkPython脚本来完成这个任务。你知道吗

有什么需要帮忙的吗?你知道吗


Tags: 文件ofno脚本for顺序sets情况
3条回答

解析文件,创建set行,每个元素按字典顺序排序。你知道吗

file1_sets = {tuple(sorted(line.split()[1:])) for line in open(file1, 'r')}
file2_sets = {tuple(sorted(line.split()[1:])) for line in open(file2, 'r')}

然后看看其中有多少存在于另一个

count = sum([f in file2_sets for f in file1_sets])

(根据评论编辑)

请尝试以下python代码:

data1, data2 = [], []
for fname, data in [('file1.txt', data1), ('file2.txt', data2)]:
    for line in open(fname):
        data.append(set(line.strip().split()[1:]))

common = [s for s in data1 if s in data2]
for c in common:
    print c
print len(common)

输出:

set(['280', '251', '428'])
set(['309', '212', '226'])
set(['336', '339', '376'])
set(['380', '339', '376'])
set(['237', '418', '193'])
5

使用集合和.intersection

with open("21132195_1.txt") as fh1, open("21132195_2.txt") as fh2:
    number_sets1 = set(frozenset(line.split()[1:]) for line in fh1)
    number_sets2 = set(frozenset(line.split()[1:]) for line in fh2)

common_number_sets = number_sets1.intersection(number_sets2)

print "%i # no. of common sets" % len(common_number_sets)
print "\n".join([" ".join(s) for s in common_number_sets])

将作为输出:

5 # no. of common sets
339 376 380
251 280 428
212 226 309
193 237 418
336 339 376

相关问题 更多 >