Mam dokument z wieloma stronami i próbuję wyodrębnić pierwsze 3 wiersze z każdej strony.

Robię to, a moje wyniki to wiele list, na przykład:

['hello','','data']
['hello','','data']
['test','','data']

Chcę usunąć wszystkie pasujące listy, na przykład strona 1 i strona 2 mają te same 3 wiersze. Chcę usunąć te 3 wiersze z oryginalnego dokumentu dla odpowiednich stron. Jak mogłem się tym zająć?

Do tej pory próbowałem użyć funkcji set and intersection. Przykład:

for item in line_list:
    common = list(set(line_list[0]).intersection(line_list[2:]))
    print (common)

Dostaję tylko puste listy. Myślę, że może to być moja składnia, ale nie jestem pewien. Czy ktoś może doradzić?

0
q21311 19 listopad 2019, 16:31
Chcesz pozostać tylko z ['hello', '', 'data'], ['test', '', 'data']? nie mogę naprawdę zrozumieć, co próbujesz osiągnąć
 – 
ranifisch
19 listopad 2019, 16:37
Nie, chcę usunąć wspólne listy z mojej pełnej strony danych. Więc jeśli nie ma wspólnych stron z ['test','','data'], ta lista może pozostać, a pętla sprawdzi następną stronę dokumentu
 – 
q21311
19 listopad 2019, 16:39

3 odpowiedzi

set.intersection nie przyjmuje iterowalnych elementów iterowalnych (które wygląda na to, że próbujesz przekazać), ale zezwala na dowolną liczbę argumentów, które według niego będą iterowalne.

Próbować:

common = list(set(line_list[0]).intersection(*line_list[2:]))

Aby uzyskać więcej informacji o tym, co robi *, wyszukaj w Google hasło „splat operator python”.

0
Harry Vane 19 listopad 2019, 16:38
Może to nie odpowiadać na to, co próbujesz zrobić ogólnie, ale powinno wskazywać na prawidłowe użycie set.intersection, abyś przynajmniej mógł właściwie ocenić jego przydatność w konkretnej sytuacji.
 – 
Harry Vane
19 listopad 2019, 16:41

W Pythonie istnieje funkcja o nazwie set, która zwraca kolekcję z unikalnymi wartościami lub krotkami listy. Problem w tym, że masz listę list. Aby to zrobić, musisz przekształcić swoją listę w krotkę, następnie użyć set, aby uzyskać unikalne listy, a następnie przekształcić ją ponownie w listę. I tak to się robi:

a = ['hello','','data']
b = ['hello','','data']
c = ['test','','data']

common = [list(x) for x in set(tuple(x) for x in [a, b, c])]
0
Felipe Endlich 19 listopad 2019, 16:39

Zakładając, że wiesz, gdzie jest duplikat, możesz w inteligentny sposób pozbyć się nadmiarowości. Możesz użyć polecenia readlines ():

lines_without_redundancy = all_lines[3::]

0
code-lukas 19 listopad 2019, 16:45
To podejście nie działa we wszystkich przypadkach, tylko w przypadkach, w których wiesz dokładnie, gdzie znajduje się duplikat.
 – 
Felipe Endlich
19 listopad 2019, 16:48
Jak wspomniałem w mojej odpowiedzi: „Zakładając, że wiesz, gdzie jest duplikat […]”, z pewnością możesz sprawić, by działało w ten sposób.
 – 
code-lukas
20 listopad 2019, 13:34