Python print lines.append()在循环if/else中

Python print lines.append()在循环if/else中,python,if-statement,append,Python,If Statement,Append,这是我的问题,我有两个文件,我想在其中读取和打印行。append(): 文件1: ID1 desc1 ID2 desc2 ID3 desc3 ID4 desc4 ID1 random1 ID5 random5 ID6 random6 ID1 random1 desc1 ID5 random5 desc5 ID6 randomI nothing address = {} with open('address.txt', 'r') as f: rows = (line.rstr

这是我的问题,我有两个文件,我想在其中读取和打印行。append():

文件1:

ID1 desc1
ID2 desc2
ID3 desc3
ID4 desc4
ID1 random1
ID5 random5
ID6 random6
ID1 random1  desc1
ID5 random5  desc5
ID6 randomI  nothing
address = {}

with open('address.txt', 'r') as f:
    rows = (line.rstrip().split('\t') for line in f)
    address = { row[0]:row[1:] for row in rows }

    for key, value in address.items():

        with open('families.txt', 'r') as f:    
            for line in f.readlines():
                line = line.rstrip('\n')
                line = line.split('\t')
                if line[0] == key: 
                    line.append(str(address[key]))
                    print ('\t'.join(line))
                else:
                    line.append('nothing')
                    print ('\t'.join(line))
文件2:

ID1 desc1
ID2 desc2
ID3 desc3
ID4 desc4
ID1 random1
ID5 random5
ID6 random6
ID1 random1  desc1
ID5 random5  desc5
ID6 randomI  nothing
address = {}

with open('address.txt', 'r') as f:
    rows = (line.rstrip().split('\t') for line in f)
    address = { row[0]:row[1:] for row in rows }

    for key, value in address.items():

        with open('families.txt', 'r') as f:    
            for line in f.readlines():
                line = line.rstrip('\n')
                line = line.split('\t')
                if line[0] == key: 
                    line.append(str(address[key]))
                    print ('\t'.join(line))
                else:
                    line.append('nothing')
                    print ('\t'.join(line))
我想要的是:

ID1 desc1
ID2 desc2
ID3 desc3
ID4 desc4
ID1 random1
ID5 random5
ID6 random6
ID1 random1  desc1
ID5 random5  desc5
ID6 randomI  nothing
address = {}

with open('address.txt', 'r') as f:
    rows = (line.rstrip().split('\t') for line in f)
    address = { row[0]:row[1:] for row in rows }

    for key, value in address.items():

        with open('families.txt', 'r') as f:    
            for line in f.readlines():
                line = line.rstrip('\n')
                line = line.split('\t')
                if line[0] == key: 
                    line.append(str(address[key]))
                    print ('\t'.join(line))
                else:
                    line.append('nothing')
                    print ('\t'.join(line))
但是,我当前的代码:

ID1 desc1
ID2 desc2
ID3 desc3
ID4 desc4
ID1 random1
ID5 random5
ID6 random6
ID1 random1  desc1
ID5 random5  desc5
ID6 randomI  nothing
address = {}

with open('address.txt', 'r') as f:
    rows = (line.rstrip().split('\t') for line in f)
    address = { row[0]:row[1:] for row in rows }

    for key, value in address.items():

        with open('families.txt', 'r') as f:    
            for line in f.readlines():
                line = line.rstrip('\n')
                line = line.split('\t')
                if line[0] == key: 
                    line.append(str(address[key]))
                    print ('\t'.join(line))
                else:
                    line.append('nothing')
                    print ('\t'.join(line))
但是,我得到了一个循环

ID1 random1  desc1
ID5 random5  nothing
ID6 randomI  nothing
ID1 random1  nothing
ID5 random5  desc5
ID6 random6  nothing
另外,如果有人能建议最好的方法,放弃作为我字典末尾“值”的一部分打印的方括号,那就太好了。

这样试试:

with open('address.txt') as fh1:
    data1 = {j[0]: j[1] for j in [i.strip().split('\t') for i in fh1.readlines()]}

with open('families.txt') as fh2:
    data2 = {j[0]: j[1] for j in [i.strip().split('\t') for i in fh2.readlines()]}

result = {k: [v, data1[k]] if k in data1 else [v, 'nothing'] for k, v in data2.items()}

我想你最好把每个文件都读入字典。不要重新读取“for”循环中的第二个文件

然后,创建第三个字典

    address = { x: y for x, y in rows }


with open('families.txt', 'r') as f:
    for line in f.readlines():
        line = line.rstrip().split()
重复第1条:

for key, value in dict1.iteritems(): #python 2.7

然后,您可以创建第三个字典,它将使用相同的键,但值将是元组。对于迭代中的每个键,如果该键存在于dict1中,则元组的第一部分是值。如果它不存在,元组的第一部分是“nothing”。然后对第二个dict执行相同的操作,即第二个值

然后在dict2上迭代,并执行相同的操作;只需检查每把钥匙;如果它已经在新的dict中,不要处理它——它已经被处理了——继续

 if key in new_dict:
     continue

一旦你有了这个新的dict,你可以按你想要的方式格式化它。提供了很多格式选项。

我删除了一些不必要的项目,希望能清理一些东西

我删除了对
'\n'
'\t'
的引用,因为
.rstrip()
.split()
方法默认情况下会自动处理这些字符

with open('address.txt', 'r') as f:
    rows = [line.rstrip().split() for line in f]
我利用for语句中的元素解包功能,将每行上的第一个和第二个项目解包为
x
y
值,以便插入到字典中

    address = { x: y for x, y in rows }


with open('families.txt', 'r') as f:
    for line in f.readlines():
        line = line.rstrip().split()
在本例中,不需要在族文件中的行和地址字典中的项之间循环。字典是为查找关键字而优化的,因此我们只需在族文件上循环,并在字典中查找

        if line[0] in address:
            line.append(str(address[line[0]]))
            print('\t'.join(line))
        else:
            line.append('nothing')
            print('\t'.join(line))

文件1是“address.txt”,文件2是“families.txt”?你的问题没有说清楚。为什么要对address.items()中的键和值执行
?只需循环“families.txt”的内容,并使用每行的ID来测试它是否在
地址
字典中。只需注意:在我看来,这只是在data2(families)中的项目上循环。如果data1(地址)中有项目不在data2(族)中,则不包括这些项目。从OP给出的示例来看,这似乎是可以的;只有OP知道这是否总是正确的。他说了他想得到什么,这就完成了工作:)正如我所说的,这符合这个例子。我只是觉得应该弄清楚它没有做什么,作为一个例子通常只是。。。