Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个网络边缘列表_Python_Awk - Fatal编程技术网

Python 比较两个网络边缘列表

Python 比较两个网络边缘列表,python,awk,Python,Awk,我有两个列表-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_nam

我有两个列表-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

现在,当我分割较小的文件时,索引超出了范围。请帮忙。此外,如果有任何其他更快的技术做同样的事情,请让我知道。谢谢

如果我正确理解您的要求,那么您所需要的就是:

$ awk '
    { edge=($1>$2 ? $1 FS $2 : $2 FS $1) }
    NR==FNR{ file1[edge]; next }
    !(edge in file1)
' child.txt master.txt
D    F
如果您想在child中找到不在master中的边,只需翻转输入文件的顺序:

$ awk '
    { edge=($1>$2 ? $1 FS $2 : $2 FS $1) }
    NR==FNR{ file1[edge]; next }
    !(edge in file1)
' master.txt child.txt
E    F

上述操作将非常快速,因为它只是进行散列查找。

您可能希望使用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_name
重新分配给该对
['E','F']
,因此下一次外循环迭代意味着
loc_name
上的内循环将设置
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

您可以将每行中的项目拆分为
frozenset
s,并将它们放入每个文件的
set
,以便您可以使用
set.difference
高效地获取
child.txt
中没有的内容:

print(' '.join({frozenset(l.split()) for l in open("master.txt")} - {frozenset(l.split()) for l in open("child.txt")}))

这种方法将每条线剥离,以便只剩下节点(例如,
AB
->
AB
)。然后,由于边是无向的,只需对这些对进行排序,然后使用列表理解来过滤出
子项中的元素即可:

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']

我尝试使用
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

边缘是无向的?是的..它们是无向的啊!现在我明白了。谢谢你给我指路!谢谢,我以前从来没有用过冰柜,它似乎很有用