【问题标题】:How to remove duplicates from output with Python?如何使用 Python 从输出中删除重复项?
【发布时间】:2015-10-01 11:42:48
【问题描述】:

在这里遇到问题:

以下示例:

for item in g_data:
        Header = item.find_all("div", {"class": "InnprodInfos"})
        print(Header[0].contents[0].text.strip())

输出:

DMZ 3rd Tunnel - Korean Demilitarized Zone Day Tour from Seoul
Panmunjeom Day Tour
Seoul City Half Day Private Tour
The Soul of Seoul - Small Group Tour
Seoul Helicopter Tour
Seoul City Full Day Tour
Seoul City Half Day Tour
The Street Museum in the Urban Core - Small Group Tour
Korean Folk Village Day Tour
DMZ 3rd Tunnel - Korean Demilitarized Zone Day Tour from Seoul
Panmunjeom Day Tour
Seoul City Half Day Private Tour
The Soul of Seoul - Small Group Tour
Seoul Helicopter Tour
Seoul City Full Day Tour
Seoul City Half Day Tour
The Street Museum in the Urban Core - Small Group Tour
Korean Folk Village Day Tour

正如你在上面看到的,它给了我两次输出。因此,只应删除第二个重复项。

结果应该是这样的:

DMZ 3rd Tunnel - Korean Demilitarized Zone Day Tour from Seoul
Panmunjeom Day Tour
Seoul City Half Day Private Tour
The Soul of Seoul - Small Group Tour
Seoul Helicopter Tour
Seoul City Full Day Tour
Seoul City Half Day Tour
The Street Museum in the Urban Core - Small Group Tour
Korean Folk Village Day Tour

谁能给我反馈如何删除重复项?感谢您提供任何反馈。

【问题讨论】:

  • 什么是g_data?如果您删除 print 分配会发生什么?
  • g_data 的类型对于回答问题并不重要。
  • 非重复行可能增长到多大?

标签: python web-crawler


【解决方案1】:

您应该将输出存储在一个集合中,以验证它是否已经“打印”过。之后你打印出集合的元素。

g_data = ["foo", "bar", "foo"]
g_unique = set()
for item in g_data:
        g_unique.add(item) # ensures the element will only be copied if not already in the set

for item in g_unique:
    print(item) # {'foo', 'bar'}

【讨论】:

    【解决方案2】:

    您可以使用列表或集合(如果顺序无关紧要):

    使用列表:

    result = []
    for item in g_data:
        header = item.find_all("div", {"class": "InnprodInfos"})
        item = header[0].contents[0].text.strip()
        if item not in result:
            result.append(item)
    
    print '\n'.join(result)
    

    使用集合:

    result = set()
    for item in g_data:
        header = item.find_all("div", {"class": "InnprodInfos"})
        result.add(header[0].contents[0].text.strip())
    
    print '\n'.join(result)
    

    【讨论】:

    • 感谢您的反馈。两种解决方案都不适合我。仍然得到重复
    【解决方案3】:

    您可以使用set 来跟踪您已打印的项目。这保留了原始顺序

    already_printed = set()
    for item in g_data:
        header = item.find_all("div", {"class": "InnprodInfos"})
        item = header[0].contents[0].text.strip()
        if item not in already_printed:
            print(item)
            already_printed.add(item)
    

    【讨论】:

    • 感谢您的反馈,但它仍然无法正常工作:g_data = soup.find_all("div", {"class": "itemsContent clearafter"}) already_printed = set() for item in g_data: Header = item.find_all("div", {"class": "InnprodInfos"}) item = (Header[0].contents[0].text.strip()) 如果 item 不在 already_printed 中: print(item) already_printed .add(item) 它仍然没有删除重复项。有什么想法吗?
    【解决方案4】:

    有一个使用列表理解的简单方法:)

    s = set()
    [s.add(text) for d_text in Header[0].contents[0].text.strip().split('\n')]
    print('\n'.join([text for text in s]))
    

    【讨论】:

    • 我也会使用 set() 来解决这个问题
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多