【问题标题】:Python print lines.append() in loop if/elsePython 在 if/else 循环中打印 lines.append()
【发布时间】:2018-01-13 19:38:44
【问题描述】:

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

文件 1:

ID1 desc1
ID2 desc2
ID3 desc3
ID4 desc4

文件 2:

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

另外,如果有人能建议最好的方法来丢弃作为我的字典“值”的一部分打印在末尾的方括号。

【问题讨论】:

  • 是 File1 'address.txt' 和 File2 'families.txt' 吗?你的问题没有说清楚。你为什么要for key, value in address.items():?只需遍历 'families.txt' 的内容并使用每行的 ID 来测试它是否在 address 字典中。

标签: python if-statement append


【解决方案1】:

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

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

with open('address.txt', 'r') as f:
    rows = [line.rstrip().split() for line in f]

我利用 for 语句中的元素解包将每行的第一项和第二项解包为 xy 值,以便插入到您的字典中。

    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))

【讨论】:

    【解决方案2】:

    我认为您最好将每个文件读入字典。不要重新读取“for”循环中的第二个文件。

    然后,创建第三个字典。

    遍历dict1:

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

    for key, value in dict1.items(): #python 3
    

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

    然后遍历dict2,做同样的事情;只需检查每个键;如果它已经在新的字典中,不要处理它——它已经被处理了——然后继续。

     if key in new_dict:
         continue
    

    一旦你有了这个新的字典,你就可以用你想要的任何方式来格式化它。 This post 提供了很多格式化选项。

    【讨论】:

      【解决方案3】:

      试试这样:

      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()}
      

      【讨论】:

      • 请注意:在我看来,这只是在 data2 (家庭)中的项目上循环。如果data1(address)中存在data2(family)中不存在的项目,则不包括在内。从 OP 给出的例子来看,这看起来没问题;只有 OP 知道这是否总是正确的。
      • 他说出了他想要得到的东西,这就是工作:)
      • 正如我所说,它适合这个例子。我只是认为应该清楚它不做什么,作为一个例子通常就是......
      猜你喜欢
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多