Próbuję zrozumieć, czy sensowne jest przeniesienie zawartości listy i dołączenie jej do innej listy.
Mam pierwszą listę utworzoną za pomocą funkcji pętli, która pobierze określone wiersze z pliku i zapisze je na liście.
Następnie używana jest druga lista, aby zapisać te linie i rozpocząć nowy cykl na innym pliku.
Moim pomysłem było pobranie listy po zakończeniu cyklu for, zrzucenie jej na drugą listę, a następnie rozpoczęcie nowego cyklu, zrzucenie zawartości pierwszej listy ponownie do drugiej, ale dołączenie, aby druga lista była suma wszystkich mniejszych plików list utworzonych w mojej pętli. Lista musi być dołączona tylko wtedy, gdy spełnione są określone warunki.
Wygląda to podobnie do tego:
# This is done for each log in my directory, i have a loop running
for logs in mydir:
for line in mylog:
#...if the conditions are met
list1.append(line)
for item in list1:
if "string" in item: #if somewhere in the list1 i have a match for a string
list2.append(list1) # append every line in list1 to list2
del list1 [:] # delete the content of the list1
break
else:
del list1 [:] # delete the list content and start all over
Czy to ma sens, czy powinienem wybrać inną trasę?
Potrzebuję czegoś wydajnego, co nie zajęłoby zbyt wielu cykli, ponieważ lista dzienników jest długa, a każdy plik tekstowy jest dość duży; więc pomyślałem, że listy pasują do celu.
Spójrz na itertools.chain, aby szybko traktować wiele małych list jako pojedynczą dużą listę (lub przynajmniej jako jedną dużą iterowalną) bez kopiowania mniejszych list:
źródło
To wydaje się dość rozsądne w przypadku tego, co próbujesz zrobić.
Nieco krótsza wersja, która opiera się na Pythonie, aby wykonać więcej ciężkich zadań, może być:
W
(True for line in list1 if "string" in line)
iteracje nadlist
i emitujeTrue
gdy zostanie znaleziony.any()
używa oceny zwarcia, aby powrócić,True
gdy tylko pierwszyTrue
element zostanie znaleziony.list2.extend()
dołącza zawartośćlist1
do końca.źródło
any(True for line in list1 if "string" in line)
jest bardziej starannie napisany jakoany("string" in line for line in list1)
.any
otrzymuje generator; nigdzie nie jest budowana lista wartości Prawda lub Fałsz. Moja wersja zwraca więcej rzeczyany
do sprawdzenia, ale w zamian za niezrobienie tego samego sprawdzenia w samym generatorze. Wyobrażam sobie, że to pranie, aletimeit
tutaj jest autorytatywne, nie ja. :)Możesz także łączyć dwie listy (powiedz a, b) za pomocą operatora „+”. Na przykład,
źródło
Podsumowując poprzednie odpowiedzi. Jeśli masz listę z
[0,1,2]
drugą[3,4,5]
i chcesz je scalić, tak się[0,1,2,3,4,5]
stanie, możesz albo użyć,chaining
alboextending
powinieneś znać różnice, aby mądrze z niej korzystać dla swoich potrzeb.Rozszerzanie listy
Za pomocą metody
list
klasextend
możesz wykonać kopię elementów z jednej listy na drugą. Spowoduje to jednak dodatkowe zużycie pamięci, co powinno być w większości przypadków w porządku, ale może powodować problemy, jeśli chcesz być wydajnym.Łańcuch listy
Przeciwnie, możesz użyć
itertools.chain
do połączenia wielu list, które zwrócą tak zwane,iterator
które można wykorzystać do iteracji po listach. Jest to bardziej wydajne pod względem pamięci, ponieważ nie kopiuje elementów, ale po prostu wskazuje następną listę.źródło
Używanie
map()
ireduce()
wbudowanych funkcjiMinimalne „do zapętlenia” i elegancki wzór kodowania :)
źródło
Jeśli mamy listę jak poniżej:
dwa sposoby skopiowania go na inną listę.
1.
2)
źródło