【问题标题】:Python Check item not in line while iterating through list迭代列表时Python检查项目不在行中
【发布时间】:2017-03-17 01:14:23
【问题描述】:

我正在尝试遍历两个列表,并且只想打印一个项目,如果它不存在于上一个列表中。我将通过非常大的文件来执行此操作,因此不想像列表或字典那样将它们存储在内存中。有没有办法在不存储到列表中的情况下做到这一点?我已经尝试以下作为示例,但没有获得所需的输出。任何帮助表示赞赏。

list_1 ='''apple
pear
orange
kiwi
strawberry
banana'''

list_2 = '''kiwi
melon
grape
pear'''


for fruit_2 in list_2.splitlines():
    for fruit_1 in list_1.splitlines():
        if fruit_1 not in fruit_2:
            print(fruit_1)

输出:

apple
pear
orange
strawberry
banana
apple
pear
orange
kiwi
strawberry
banana
apple
pear
orange
kiwi
strawberry
banana
apple
orange
kiwi
strawberry
banana

所需的输出(不在列表 2 中的项目):

apple
orange
strawberry
banana

【问题讨论】:

  • 您的列表 1 中是否有重复,您要打印它们吗?我假设这只是示例数据,因为水果种类很多。

标签: python iterator iteration


【解决方案1】:

这个脚本

list_1 = ['apple',
          'pear',
          'orange',
          'kiwi',
          'strawberry',
          'banana']

list_2 = ['kiwi', 
          'melon',
          'grape',
          'pear']

for fruit_1 in list_1:
    # reset iterator for list_2 at this line
    # ........... 

    if all(fruit_1 not in fruit_2 for fruit_2 in list_2):
        print(fruit_1)

输出:

apple
orange
strawberry
banana

由于文件非常大,您可能需要在 if 语句之后/之前重置 list_2 的迭代器。

【讨论】:

  • 谢谢。这工作得非常好,并且用很少的代码很快就完成了。对 Python 来说还是新手,不知道可以通过这种方式完成。感谢您的帮助。
  • @MBasith 很高兴听到。请注意,我的版本仅使用列表。对于您的版本,您需要文件对象作为迭代器。然而那是完全一样的。
【解决方案2】:

你可以试试这个:

with open("list1") as f1,open("list2") as f2:
    for line1 in f1:
        for line2 in f2:
            if line1 not in line2.strip():
                print line1

尝试将此文件拆分为list1list2,并逐行读取。 上面的代码每次都会读取一行到内存,这意味着它不会占用你太多的内存。完成后它会关闭文件。

【讨论】:

  • 关于使用 readfile 对象作为迭代器的建议很好。但输出不是他要求的。
【解决方案3】:

在字符串中使用find函数来检查,像这样:

for fruit_1 in list_1.splitlines():
    if list_2.find(fruit_1) == -1:
        print(fruit_1)

【讨论】:

    【解决方案4】:

    据我所知,为了演示而将示例转换为列表并没有什么坏处,所以我这样做是为了让它更清楚一点。当然,您不必在程序中使用列表。此解决方案使用 Python 的 for ... else 语句。

    list_1 = [
        apple,
        pear,
        orange,
        kiwi,
        strawberry,
        banana
        ]
    
    list_2 = [
        kiwi,
        melon,
        grape,
        pear
        ]
    
    for item_1 in list_1:
        for item_2 in list_2:
            if item_1 == item_2:
                break
        else:
            print(item_1)
    

    【讨论】:

      【解决方案5】:

      您的代码不工作的原因是外部循环一次从list_2 中选择一项。然后内部循环遍历list_1 中的每个值,并将其与list_2 中的一项进行比较。这会导致内部循环在每次执行时打印list_1 中的所有水果(如果它在list_2 中,则打印除一个以外的所有)。

      这是一个简单的解决方案:

      fruit_2_list = list_2.splitlines()
      for fruit_1 in list_1.splitlines():
          if fruit_1 not in fruit_2_list:
              print(fruit_1)
      

      这使用in 运算符来检查list_1 中的每个项目与list_2 中的所有项目。它只会遍历list_1,并会产生你想要的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        • 2020-05-27
        • 2011-11-26
        • 2017-12-21
        • 1970-01-01
        相关资源
        最近更新 更多