我有两个列表-master.txt和它的子集child.txt。我想打印master.txt中不存在child.txt中的边缘
master.txt
A B
B C
D F
child.txt
B A
C B
E F
输出: D F
我已经编写了示例代码
file1 = open("master.txt", "r")
file2 = open("child.txt", "r")
probe_id = file1.readlines()
loc_names = file2.readlines()`
#flag=0
for i in probe_id:
i=i.rstrip()
probe_info=i.split("\t")
probe_info[0]=probe_info[0].strip()
probe_info[1]=probe_info[1].strip()
flag=0
for j in loc_names:
j=j.strip()
loc_names=j.split("\t")
loc_names[0]=loc_names[0].strip()
loc_names[1]=loc_names[1].strip() #throwing index out of range error
if (probe_info[0]==loc_names[0] and probe_info[1]==loc_names[1]) or (probe_info[0]==loc_names[1] and probe_info[1]==loc_names[0]):
flag=1
if flag==0:
print i
截至目前,分割较小的文件时索引超出范围。请帮助。另外,如果还有其他更快的技术可以执行相同的操作,请告诉我。谢谢
答案 0 :(得分:2)
如果我正确理解您的要求,那么您所需要的就是:
$ awk '
{ edge=($1>$2 ? $1 FS $2 : $2 FS $1) }
NR==FNR{ file1[edge]; next }
!(edge in file1)
' child.txt master.txt
D F
如果您想在子级中找到不在母版中的边缘,只需翻转输入文件的顺序即可:
$ awk '
{ edge=($1>$2 ? $1 FS $2 : $2 FS $1) }
NR==FNR{ file1[edge]; next }
!(edge in file1)
' master.txt child.txt
E F
由于只是进行哈希查找,因此上述操作将非常快。
答案 1 :(得分:1)
您可能想使用python dict
进行快速查找:
child = {}
with open('child.txt', 'r') as c:
for line in c:
p1, p2 = line.strip().split()
child[p1] = p2
child[p2] = p1
with open('master.txt', 'r') as m:
for line in m:
p1, p2 = line.strip().split()
if child.get(p1) == p2:
continue
print(line)
关于您的代码,您正在将loc_names
分配给['E', 'F']
对,因此外循环的下一次迭代意味着loc_names
上的内部循环将j
设置为'E'
:
file1 = open("master.txt", "r")
file2 = open("child.txt", "r")
probe_id = file1.readlines()
loc_names = file2.readlines()`
#flag=0
for i in probe_id:
i=i.rstrip()
probe_info=i.split("\t")
probe_info[0]=probe_info[0].strip()
probe_info[1]=probe_info[1].strip()
flag=0
for j in loc_names: # j will be 'E' after second iteration of outer loop
j=j.strip()
loc_names=j.split("\t")
loc_names[0]=loc_names[0].strip()
loc_names[1]=loc_names[1].strip() # loc_names is ['E', 'F']
if (probe_info[0]==loc_names[0] and probe_info[1]==loc_names[1]) or (probe_info[0]==loc_names[1] and probe_info[1]==loc_names[0]):
flag=1
if flag==0:
print i
答案 2 :(得分:1)
您可以将每一行中的项目拆分为frozenset
,然后将其放入每个文件的set
中,以便可以使用set.difference
来获取{ {1}}有效:
child.txt
答案 3 :(得分:0)
此方法将每一行剥离,以便仅保留节点(例如A B
-> AB
)。然后,由于边缘是无方向的,只需对这些对进行排序,然后使用列表推导过滤掉child
中的元素:
with open("master.txt", "r") as f:
master = [''.join(sorted(x.strip().replace(" ", ""))) for x in f.readlines()]
with open("child.txt", "r") as f:
child = [''.join(sorted(x.strip().replace(" ", ""))) for x in f.readlines()]
[x for x in master if x not in child] # ['DF']
答案 4 :(得分:0)
我尝试使用set
来筛选出重复项:
with open('master.txt', 'r', newline='') as master_in, \
open('child.txt', 'r', newline='') as child_in:
seen = set(tuple(sorted(line.split())) for line in child_in)
for line in master_in:
if tuple(sorted(line.split())) not in seen:
print(line)
打印:
D F