Как я могу удалить любую повторную строку в многострочную строку - PullRequest
0 голосов
/ 23 октября 2019

У меня есть многослойная строка, которая имеет несколько повторяющихся строк. Я хочу удалить не только повторную строку, но и «оригинал», который повторяется.

Я нашел несколько ответов о том, чтобы удалить только повторную строку, оставить оригинал, но я не знал, как его адаптировать, и когда я попытался, у меня не получилось.

text = """<br/>
Somewhere in China there is a copy of this vid.<br/>
2 years ago<br/>
Not sure really<br/>
Aiur Productions<br/>
Aiur Productions<br/>
2 years ago<br/>
"""<br/>

lines_seen = set()  # holds lines already seen<br/>

for line in text:
       if line not in lines_seen:  # not a duplicate
            print(lines_seen.add(line))

Я получил несколькостроки "нет". Как уже упоминалось, приведенный выше код исходит из другого вопроса, когда запрашивающий хотел удалить повторяющиеся строки, но оставить неповторяющиеся и одну версию повторных. То, что я хочу, это вывод, как это:

Где-то в Китае есть копия этого видео. Не уверен, что действительно

со всеми дублированными строками (например, «два года назад») удалены, так что остаются только те строки, которые не были повторены в оригинале.

Ответы [ 4 ]

1 голос
/ 23 октября 2019

Вы можете решить вашу проблему, используя этот подход:

  1. считать уникальные строки, встречающиеся в тексте;
  2. выбирать строки, встречающиеся только один раз.

from collections import Counter

text = """<br/>
Somewhere in China there is a copy of this vid.<br/>
2 years ago<br/>
Not sure really<br/>
Aiur Productions<br/>
Aiur Productions<br/>
2 years ago<br/>
"""

str_counts = Counter(text.replace('<br/>', '').split('\n'))
result = '\n'.join([elem for elem in str_counts if str_counts[elem] == 1])

print(result)
# Somewhere in China there is a copy of this vid.
# Not sure really
1 голос
/ 23 октября 2019
from collections import Counter, OrderedDict

class OrderedCounter(Counter, OrderedDict):
    'Counter that remembers the order elements are first encountered'

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))

    def __reduce__(self):
        return self.__class__, (OrderedDict(self),)



updated = []

for k,v in OrderedCounter(text.split('<br/>')).items():
    if v == 1:
        updated.append(k)

print('<br/>'.join(updated))
1 голос
/ 23 октября 2019

set.add() ничего не возвращает. Когда вы пытаетесь напечатать его возвращаемое значение, вы получите None. Если вы хотите одновременно напечатать строку и и поместить ее в набор, вам нужно использовать два отдельных оператора:

for line in text:
   if line not in lines_seen:  # not a duplicate
        print(line)
        lines_seen.add(line)

. Каждая строка будет напечатана один раз в первом виде. Если вы хотите напечатать только строк, которые никогда не дублируются, я бы порекомендовал сохранить параллельный список строк, которые никогда не повторялись:

lines_seen = set()
unique_lines = list()
for line in text:
    if line not in lines_seen:
        lines_seen.add(line)
        unique_lines.append(line)
    elif line in unique_lines:
        unique_lines.remove(line)
# and then print all the lines that were not removed from unique_lines on their second appearance
# in the order that they first appeared
for line in unique_lines:
    print(line)
0 голосов
/ 23 октября 2019

Я не на 100% уверен, что вы спрашиваете, но я думаю, что вы хотите распечатать все строки, но не те, которые повторяются более одного раза.

lines = []
delete = []
for line in text.split("\n"):
    if line in lines:
        if lines.index(line) not in delete:
            delete.append(line)
    else:
        lines.append(line)
[lines.pop(x) for x in delete]

Этот код не являетсяидеально, но следует передать идею

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...