如何从充满句子的列表中检测重复的句子?

2024-06-02 16:00:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前试过这个:

path = input()
f = open(path,'r+', encoding='utf-8')
data = f.readlines()
list1 = []
list1 = [data]
list2 = []
list2 = [x for n, x in enumerate(list1) if x in list1[:n]]
print(list2)

输出:[](无其他内容) 通过观察,我可以确定我的txt文件中有3行重复的句子,但为什么程序无法检测到它? 或者有没有更好的代码来检测重复的句子而不是使用枚举函数

2021-07-17 19:03:05 [Kircher Alden]- Alas, alas, that great COVER
2021-07-17 19:03:05 [Kircher Alden]- Alas, alas, that great COVER
2021-07-17 19:03:05 [Oseph Steven]- 🌽🐏🔥
2021-07-17 19:03:05 [Kircher Alden]- Alas, alas, that great COVER
2021-07-17 19:03:05 [sheep Lec]- こんぬい~!
2021-07-17 19:03:05 [なおるひ]- こんぬい~
2021-07-17 19:03:05 [ken.]- こんぬい~🔥
2021-07-17 19:03:05 [迦楼羅]- 自称w
2021-07-17 19:03:05 [Nikki_watamate]- こんぬい~~
2021-07-17 19:03:05 [またじろうmatajirou]- こんばんはー!!
2021-07-17 19:03:05 [いちにー]- ん?
2021-07-17 19:03:05 [桜小路こいし]- こんぬい~🔥
2021-07-17 19:03:06 [錯乱した青年C]- こんぬいー
2021-07-17 19:03:06 [博雅]- こんぬい~🔥
2021-07-17 19:03:06 [Ramon Gullett]- 直 到 永 永 远 远 。
2021-07-17 19:03:06 [Ramon Gullett]- 直 到 永 永 远 远 。
2021-07-17 19:03:06 [Ramon Gullett]- 直 到 永 永 远 远 。
2021-07-17 19:03:06 [出雲]- こんぬい~!
2021-07-17 19:03:06 [。ロクマル]- こんぬい〜!
2021-07-17 19:03:07 [ルシルイ「RushiRui」]- こんぬい〜
2021-07-17 19:03:07 [たけゆき]- こんぬい~
2021-07-17 19:03:07 [sss]- かな?
2021-07-17 19:03:07 [ももてぃん]- こんぬい!!!
2021-07-17 19:03:07 [Calico cat]- 👏👏👏👏👏
2021-07-17 19:03:07 [Rari Ehlani]- как будто судьи в суде
2021-07-17 19:03:07 [ちゃかげ]- ん?
2021-07-17 19:03:07 [dew 0w0]- Hi friend
2021-07-17 19:03:07 [メネスexam]- かな?
2021-07-17 19:03:08 [kotoharu]- なんでも?!
2021-07-17 19:03:08 [夏目陽射]- おおー!!
2021-07-17 19:03:08 [Jackson Winget]- 哀 哉 , 哀 哉 , 这 大 COVER 阿
2021-07-17 19:03:08 [Dong Vaught]- 直 到 永 永 远 远 。
2021-07-17 19:03:08 [オウィスクリーク]- 草
2021-07-17 19:03:08 [ストラ]- 自称w
2021-07-17 19:03:08 [カルマ]- 👏👏👏
2021-07-17 19:03:08 [Jackson Winget]- 哀 哉 , 哀 哉 , 这 大 COVER 阿
2021-07-17 19:03:08 [Jackson Winget]- 哀 哉 , 哀 哉 , 这 大 COVER 阿
2021-07-17 19:03:08 [トール]- 草
2021-07-17 19:03:08 [Gordon Fryer]- Alas, alas, that great COVER
2021-07-17 19:03:08 [Dong Vaught]- 直 到 永 永 远 远 。
2021-07-17 19:03:08 [Dong Vaught]- 直 到 永 永 远 远 。
2021-07-17 19:03:08 [グリード]- 草
2021-07-17 19:03:08 [Gordon Fryer]- Alas, alas, that great COVER
2021-07-17 19:03:08 [とどぐら雄]- ふーたん!今日はよろしくね
2021-07-17 19:03:08 [miro]- lol
2021-07-17 19:03:08 [Gordon Fryer]- Alas, alas, that great COVER
2021-07-17 19:03:08 [大分県のボードゲーマー]- 自称w
2021-07-17 19:03:09 [オッドポール三等軍曹]- かな?草
2021-07-17 19:03:09 [renrenドドド]- 👏👏👏👏👏👏
2021-07-17 19:03:09 [ばとうさ]- こんぬい~
2021-07-17 19:03:09 [プレーネ]- 草

Tags: thatcoverlist2jacksongreatlist1dongalas
3条回答

如果您只想检测文件中是否有重复的句子,请使用set()

if len(list(f.readlines()))==len(set(f.readlines())):

data是行的列表,因此list1是一个项目的列表:行的列表。如果您改为list1 = data,则应找到您的副本

首先,你不应该在列表中查找事物列表:列表查找很慢,随着列表长度的增加,你会得到非常糟糕的性能(谷歌“二次行为”)

如果你的句子真的一模一样,一个字一个字,这将是一个有效的方法来找出:

from collections import Counter

with open(path,'r', encoding='utf-8') as f:
    sentences = Counter(f)  # read line by line and count

duplicates = [s for s in sentences if sentences[s] > 1]

如果行不完全相同,则需要先读入并清理,大致如下:

with open(path,'r', encoding='utf-8') as f:
    raw = list(f)
    # clean the strings here, then 

    sentences = Counter(raw)  # read line by line and count
    ...

相关问题 更多 >